English 中文(简体)
删除与JOIN、Group by和HAVING的表格
原标题:Delete from a table with JOIN, GROUP BY and HAVING
  • 时间:2012-05-21 15:14:43
  •  标签:
  • mysql

我有一张表格carts cart items ,第二个表格有第一个表格的外国密钥 。 现在我想删除所有3个月以上且没有相关 cartites carts 行。 以下查询给了我正确的结果 :

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 表格中有1 000万行,我非常感谢就如何改进这一查询提出建议:-)

最佳回答

您可以在无 LIMIT 或无 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
问题回答

你可以试试这个

DELETE FROM 
(
    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 FROM `carts` WHERE EXISTS (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 FROM `carts` WHERE `carts`.`id` IN (SELECT `c`.`id` 
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);

生成一个 ID 列表( 我希望 c. id 是您的主要密钥), 并删除所有与该代号相关的行 。





相关问题
SQL SubQuery getting particular column

I noticed that there were some threads with similar questions, and I did look through them but did not really get a convincing answer. Here s my question: The subquery below returns a Table with 3 ...

please can anyone check this while loop and if condition

<?php $con=mysql_connect("localhost","mts","mts"); if(!con) { die( unable to connect . mysql_error()); } mysql_select_db("mts",$con); /* date_default_timezone_set ("Asia/Calcutta"); $date = ...

php return a specific row from query

Is it possible in php to return a specific row of data from a mysql query? None of the fetch statements that I ve found return a 2 dimensional array to access specific rows. I want to be able to ...

Character Encodings in PHP and MySQL

Our website was developed with a meta tag set to... <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> This works fine for M-dashes and special quotes, etc. However, I ...

Pagination Strategies for Complex (slow) Datasets

What are some of the strategies being used for pagination of data sets that involve complex queries? count(*) takes ~1.5 sec so we don t want to hit the DB for every page view. Currently there are ~...

Averaging a total in mySQL

My table looks like person_id | car_id | miles ------------------------------ 1 | 1 | 100 1 | 2 | 200 2 | 3 | 1000 2 | 4 | 500 I need to ...

热门标签