2013-07-30 35 views
1

我有一个困难的删除任务,需要您的善意帮助。 数据库涉及在不同城市出售的交易(行数超过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) 

此代码的问题是运行此代码后,只有一行重复行被移动。有更好的解决方案

回答

0

我希望我能评论,因为这不是一个真正的答案。但是你有没有尝试隔离子查询,看看你的SELECT ID FROMGROUP BY LEFT(title, 35) HAVING COUNT(*)>1 AND COUNT(DISTINCT city_id )>1是否返回多行?如果是这样,请回到步骤并检查是否​​并查看它是否返回多个结果等等。

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) 

在您的查询的问题是,在选择查询的GROUP BY子句仅返回一行。

相关问题