01/10/2018, 16:41

Hỏi về lệnh MySql

có cách nào để xóa cái cùng id product mà số lượng (amount ) nhỏ hơn ko ạ.

vũ xuân quân viết 18:54 ngày 01/10/2018

Thử dùng câu sql này.

DELETE FROM table_A WHERE product_id=1 order by amount limit 1

Review Game viết 18:56 ngày 01/10/2018

ths ạ . . …

Sáng Béo viết 18:42 ngày 01/10/2018

cái này nếu product đó chỉ có 1 record thì nó cũng xoá luôn.

vũ xuân quân viết 18:46 ngày 01/10/2018

Đồng ý với bạn,
cần phải có 1 câu sql để kiểm tra xem procut_id có số dòng lớn hơn hoặc bằng 2 thì mới tiến hành hình xóa.
do câu hỏi chỉ nói xóa thôi nên chỉ cho câu sql để xóa.
cái này cần có thêm nghiệp vụ vào(business logic) thì mới biết cách xử lý trước đó như thế nào.

Hai Lúa viết 18:51 ngày 01/10/2018

Thử xem nhé:

1. Đầu tiên tìm những dòng bị dulicate product_id

select product_id, max(amount) MAX_Amount
from table_a
group by product_id
having count(*) > 1

2. Giờ tìm những dòng bị duplidate, mà có AMOUNT nhỏ hơn Max_AMOUNT.

select ID
from table_a A,
       (select product_id, max(amount) MAX_Amount
           from table_a
         group by product_id
        having count(*) > 1
       ) B
where A.product_ID=B.Product_ID
   and  A.Amount < B.MAX_Amount

3. Sau khi có những dòng cần tìm, giờ gán nó vào câu DELETE

DELETE FROM table_A
where ID in 
( _câu query ở trên_ )

=> Lưu ý là với cách làm trên, những rows cùng product_id, và cùng max_amount vẫn ko bị xóa !

Phan Ngoc viết 18:44 ngày 01/10/2018

cái 2 dùng subquery có vẻ chậm đó bạn

Hai Lúa viết 18:54 ngày 01/10/2018

Ko phải cứ subquery là chậm, đó là quan niệm sai lầm của người mới học sql (thấy viết câu sql dài => chậm).
Bản chất khi query từ VIEW đã là subquery, hay như (2) có thể xem là in-line view.

Muốn biết chậm hay ko ngoài việc đánh giá chủ quan quá trình xử lý của câu lệnh trong từng trường hợp (vd: join trước, hay filter trước là có lợi hơn?), ngoài ra con phải xem execution plan để biết câu lệnh sẽ được chạy như thế nào, indexes nào được dùng, indexes nào bị missed,…

Riêng với câu correlated subquery thì phải cẩn thận hơn, mặc dù một số csdl lớn như Oracle có khả năng rewrite lại bad/stupid sql.

Thanks bạn mod nào đã giúp format lại bài post trên.

Bài liên quan
0