我有一个表carts
和cartitems
,第二个表具有到第一个的外键。现在,我想从carts
中删除所有早于3个月且没有相关cartitems
的行。以下查询为我提供了正确的结果:
SELECT *
FROM `carts` c
LEFT OUTER JOIN `cartitems` i ON ( `c`.`id` = `i`.`cart_id` )
WHERE `c`.`last_updated` < DATE_SUB(NOW() , INTERVAL 3 MONTH)
GROUP BY `c`.`id`
HAVING COUNT( `i`.`id` ) = 0;
但是我不知道如何将查询转换为
DELETE
。另外,由于
carts
表中有约1000万行,因此,我很感谢提出有关如何改进此查询的建议:-) 最佳答案
您可以不使用LIMIT
或使用LIMIT
运行以下命令以批量删除行。
DELETE c
FROM carts c
WHERE c.last_updated < DATE_SUB(NOW() , INTERVAL 3 MONTH)
AND NOT EXISTS
( SELECT *
FROM cartitems i
WHERE c.id = i.cart_id
)
LIMIT 10000 ; --- optional
关于mysql - 使用JOIN,GROUP BY和HAVING从表中删除,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10687956/