我有一个表cartscartitems,第二个表具有到第一个的外键。现在,我想从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/

10-11 22:44
查看更多