PHP MYSQL Duplicate rows filter - php

I want find duplicate records in table
table_name: billing
there are 7 cols, but I am intrested in only 3 cols values.
I want find rows, where 3 cols (suite, comment, amount) values are similar
For example:
suite comment amount other col
11 44 0.00 88
11 44 0.00 33
17 48 1.00 11
17 48 1.00 35
17 48 1.00 21

Not particularly efficient, but if you don't need to do this quickly.
Select b.* from
(SELECT
Suite, comment, amount
FROM
YourTable
GROUP BY
Suite, comment, amount
Having count(1) > 1) a
Inner join
YourTable b
On a.suite = b.suite and a.comment = b.comment and a.amount = b.amount

Related

MySql - Update the status of rows using FIFO logic

I've the below mysql table where I want to update multiple rows of approval_status field with 1 if the quantity passed is more than the qty_req value using MySql or PHP.
Requisition table:
id
part_id
qty_req
approval_status
1
16
20
0
2
17
30
0
3
16
40
0
4
17
50
0
5
17
60
0
Example:
$update_status=Array (
[0] => Array ( [part_id] => 17 [qty] => 90 )
[1] => Array ( [part_id] => 16 [qty] => 70 )
)
From the above array, 90 is the quantity available for the part_id 17. I want to update the approval_status as 1 in the requisition table for the rows with the part_id as 17 with the below scenario:
Update the approval_status to 1 as the quantity of the first row with part_id 17 is 30 which is less than 90.
Update the approval_status to 1 as the quantity of the second row with part_id 17 is 30+50=80 which is less than 90.
Third row won't update as the total 30+50+60=140 is greater than 90.
Unfortunately, I couldn't find any tutorial to achieve this.
Any help would be appreciated. Thanks in advance.
Single data:
UPDATE test t1
NATURAL JOIN ( SELECT *, SUM(qty_req) OVER (ORDER BY reg_date) cum_sum
FROM test
WHERE part_id = #part_id ) t2
SET t1.approval_status = 1
WHERE cum_sum <= #qty;
Multiple data:
UPDATE test t1
NATURAL JOIN ( SELECT test.*,
SUM(qty_req) OVER (PARTITION BY part_id ORDER BY reg_date) cum_sum,
qty
FROM test
JOIN JSON_TABLE(#json,
'$[*]' COLUMNS ( part_id INT PATH '$.part_id',
qty INT PATH '$.qty')) jsontable USING (part_id) ) t2
SET t1.approval_status = 1
WHERE cum_sum <= qty;
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=7cf062d81a138657dee78f3026623783
Column reg_date and unique index added for to provide definite and unambiguous rows ordering.
The solution applicable to MySQL 5.6:
UPDATE test t1
NATURAL JOIN ( SELECT t1.part_id,
t1.qty_req,
t1.approval_status,
t1.reg_date,
SUM(t2.qty_req) cum_sum
FROM test t1
JOIN test t2 USING (part_id)
WHERE t1.reg_date >= t2.reg_date
GROUP BY t1.part_id,
t1.qty_req,
t1.approval_status,
t1.reg_date ) t2
JOIN ( SELECT 17 part_id, 90 qty
UNION ALL
SELECT 16, 50 ) t3 USING (part_id)
SET t1.approval_status = 1
WHERE t2.cum_sum <= t3.qty
https://dbfiddle.uk/?rdbms=mysql_5.6&fiddle=0aad358941f66d1f385799072237d513
Source data must be formed as a query text - see subquery t3.

Join Query to get data from multiple rows into a single row

Selecting data from multiple rows into a single row
Quote_ws table
quote_ws_id quote_id gross tax
101 79 98.25 13.0
102 79 91.25 12.5
103 79 94.25 11.0
104 79 92.25 11.5
105 79 96.25 12.0
Section_table
section_id quote_id lsb(quote_ws_id) non_lsb(quote_ws_id)
1 79 101 null
2 79 102 103
3 79 104 105
I am trying to create a MYSQL query that will return gross and tax values from table "Quote_ws" based on lsb and non lsb values in 'Section' table.The results would be:
section_id quote_id gross tax
1 79 98.25 13.0
2 79 91.25 + 94.25 12.5+11.0
(lsb 102,non-lsb 103) (lsb 102,non-lsb 103)
3 79 92.25 + 96.25 11.5+12.0
(lsb 104,non-lsb 105) (lsb 104,non-lsb 105)
I am new to SQL. How can I do that? Please help me ??
SELECT
s.section_id,
s.quote_id,
(IFNULL(q_lbs.gross, 0)+IFNULL(q_non_lbs.gross, 0)) as gross,
(IFNULL(q_lbs.tax, 0)+IFNULL(q_non_lbs.tax, 0)) as tax,
FROM
Section_table s
LEFT JOIN Quote_ws q_lbs
ON q.quote_id = q.quote_id
LEFT JOIN Quote_ws q_non_lbs
ON q.quote_id = q.quote_id;

Select where rows exist more than once with variation

This is a hard one to put a title to so I apologise for ambiguity.
I have the following MySQL table (it's a Magento table):
id attr_id store_id entity_id value
----+---------+---------+------------+------------------------
1 45 0 173 Sale Gifts + Apartment
2 45 0 175 Sale Outerwear
3 45 1 175 Sale Outerwear
4 45 0 177 (null)
5 45 1 177 New Arrivals
6 45 0 178 New Tops
7 45 1 178 New Tops
As you can see, some of the rows have the same everything except store_id.
I want to do the following:
If a row with store_id = 0 has a duplicate row, but with store_id = 1 and different values (for example, rows 4 and 5 above), update the row with store_id = 0 to have the same value as the other.
Delete the row with store_id = 1
I know I will probably need a combination of both PHP and MySQL for this. I just don't know what the MySQL query would be.
Any help would be great!
EDIT
The end goal from the above table is the following
id attr_id store_id entity_id value
----+---------+---------+------------+------------------------
1 45 0 173 Sale Gifts + Apartment
2 45 0 175 Sale Outerwear
4 45 0 177 New Arrivals
6 45 0 178 New Tops
In order to retrive redundunt values having the same entity_id, you can do :
SELECT
*
FROM
magento m1, magento m2
WHERE
m1.attr_id=m2.attr_id
AND
m1.entity_id=m2.entity_id
AND
m1.id > m2.id
And for fixing null values, you will need to loop the above results and search for the null and replace it with the previous or next result.

mysql distinct manufacturer,count of 2 other columns and sum of value

Afternoon,
I have a couple of tables in mysql
The first holds the ticket information and status of ticket
The second holds the items and costs for each item.
Each ticket can have multiple items which are stored into the items table.
example table 1
Ticket id Manufacturer status
102 man-A 10
103 man-A 20
104 man-A 10
105 man-C 10
106 man-B 20
example table 2
Ticket id Item Price
102 item_a 100.00
103 item_a 100.00
103 item_b 110.00
103 item_c 115.00
104 item_c 115.00
105 item_b 110.00
106 item_a 100.00
106 item_c 115.00
now on a quick stats page i need to show.
Manufacturer Qty(status 10) Qty(status 20) Value
man-A 2 1 530.00
man-B 0 1 225.00
man-C 1 0 110.00
If there are no tickets with status 10 or status 20 i do not need to show that manufacturer.
I would like to do 1 mysql request to get the stats i need to show.
Many Thanks
Try this with join and using SUM()
SELECT
t1.Manufacturer,
SUM(t1.status =10) `Qty(status 10)`,
SUM(t1.status =20) `Qty(status 20)`,
SUM(t2.price) `Value`
FROM table1 t1
JOIN table2 t2 ON (t1.`Ticket id` =t1.`Ticket id`)
GROUP BY t1.Manufacturer
Fiddle Demo

MYSQL Update single records a table with MIN & MAX values from multiple records in 2nd table MYSQL

I have 2 tables houses & availability - I want to find the min and max for the RENT field for each HOUSEID in AVAILABILITY this contains many records per JOUSEID , then UPDATE the HOUSES table fields MIN_RENT and MAX_RENT, the HOUSES table contains only one entry per HOUSE ID
HOUSES
houseid min_rent max_rent
121 40.00 90.00
122 50.00 80.00
123 40.00 100.00
AVAILABILITY
house_id date rent
121 01/01/12 40
121 01/02/12 50
121 01/03/12 60
121 01/04/12 90
122 01/01/12 40
122 01/02/12 50
122 01/03/12 60
122 01/04/12 80
123 01/01/12 40
123 01/02/12 50
123 01/03/12 60
123 01/04/12 90
Regards
Martyn
a faster solution
UPDATE
HOUSES H
,(
SELECT
house_id
,MIN( rent ) AS min
,MAX( rent ) AS max
FROM
AVAILABILITY
GROUP BY
house_id
) AS A
SET
min_rent = A.min
,max_rent = A.max
WHERE
H.house_id = A.house_id

Categories