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 ạ.

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

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

2 Likes

ths ạ . . …

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

2 Likes

Đồ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.

2 Likes

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 !

3 Likes

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

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.

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?