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)

このコードの問題は、このコードを実行した後、重複した行の 1 行だけが移動されることです。より良い解決策はありますか?

4

2 に答える 2

1

考えられる最善の解決策の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 句が 1 行しか返さないことでした。

于 2013-10-17T03:34:25.640 に答える
0

これは実際の答えではないので、コメントできたらいいのにと思います。しかし、サブクエリを分離して、SELECTidFROMテーブルGROUP BY LEFT(title, 35) HAVING COUNT(*)>1 AND COUNT(DISTINCTcity_id)>1が複数の行を返すかどうかを確認しようとしましたか? その場合は、ステップに戻って、Select t2.id from (Subquery)複数の結果が返されるかどうかなどを確認してください。

于 2013-10-15T19:07:36.847 に答える