两个条件下的复杂重复行删除任务

时间:2013-07-30 07:02:46

标签: mysql sql sql-delete

我删除任务有困难,需要你的帮助。 该数据库涉及在不同城市销售的交易(行数超过400.000)。我的任务是删除在多个城市同时销售的同一笔交易。但是,同一笔交易可能会在不同时间在一个城市出现几次。相同的交易具有相同的标题(至少前12个特征)。

以下是简化数据样本

id;   city_id;   starting_date;   title;   

1;     A;        30.01.2013;    chain hotel A coupon

2;     B;        30.01.2013;    chain hotel A coupon

3;     C;        30.01.2013;    chain hotel A coupon

4;     A;        01.03.2013;    chain hotel A coupon

5;     A;        06.05.2013;    restaurant A coupon

6;     A;        30.05.2013;    restaurant A coupon 

我想删除在多个城市同时销售的所有交易,但保持在不同时间在城市中销售的交易。以下是我的代码:

DELETE FROM `table` 
WHERE `id` in 
(SELECT t2.`id` from
(
SELECT `id` 
FROM `table` 
GROUP BY LEFT(title, 35) 
HAVING COUNT(*)>1
AND COUNT(DISTINCT `city_id`)>1) 
as t2)

此代码的问题在于,在运行此代码后,只移动了一行重复行。有更好的解决方案吗?

2 个答案:

答案 0 :(得分:1)

最好的解决方案之一。 Fiddle

delete t.* from `table` t inner join(

select `starting_date`,  `title`
FROM `table` 
GROUP BY LEFT(title, 35) , starting_date
having count(*) >1 and COUNT(DISTINCT `city_id`)>1) dup on dup.`Starting_date`  =  t.`starting_date`
and left (dup.`title`,35) = left(t.`title`,35)

查询中的问题是select查询中的GROUP BY子句只返回一行。

答案 1 :(得分:0)

我希望我能够发表评论,因为这不是一个真正的答案。但是,您是否尝试隔离子查询以查看您的SELECT ID FROMGROUP BY LEFT(title, 35) HAVING COUNT(*)>1 AND COUNT(DISTINCT city_id )>1是否返回多行?如果是这样,请返回一步,检查是否Select t2.id from (Subquery)并查看是否返回多个结果等等。