2013-07-30 61 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子句僅返回一行。

相關問題