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)

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

4

2 回答 2

1

最好的解决方案之一。小提琴

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 子句只返回一行。

于 2013-10-17T03:34:25.640 回答
0

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

于 2013-10-15T19:07:36.847 回答