2010-11-09 24 views
4

我試圖使SQL誰將會刪除所有重複的標題,但必須具備這些條件刪除重複:刪除所有重複的主題與幾個條件

  • 只能刪除重複同樣具有OBJECT_ID
  • 絕只保留最新的記錄(最大topic_id)(topic_id是每一個話題AI的唯一ID)

到目前爲止,我已經做了(與選擇的測試...)

SELECT topic_id,object_id,title,url,date 
FROM topics GROUP BY title 
HAVING (COUNT(title) > 1) 
ORDER BY topic_id DESC 

但是不符合條件。
我正在使用mysql。

回答

5

MySQL,你不能指定目標表的DML操作在一個子查詢(除非你窩它比一個深層次的,但在這種情況下,你不會得到可靠的結果,並不能使用相關子查詢)。

使用JOIN

DELETE td 
FROM topics td 
JOIN topics ti 
ON  ti.object_id = td.object_id 
     AND ti.title = td.title 
     AND ti.topic_id > td.topic_id; 

此創建於topics (object_id, title, topic_id)的索引快速地工作。

+0

謝謝,似乎它會完成這項工作。 – T1000 2010-11-09 13:12:20

1

這將刪除所有重複的object_id記錄,保存具有最高topic_id的記錄。

delete from topics outer where exists 
(
    select 1 from topics inner where 
     outer.object_id = inner.object_id AND 
     inner.topic_id < outer.topic_id 
) 
+0

無法在'MySQL'中工作。將導致'錯誤代碼:1093你不能在FROM子句中指定目標表進行更新' – Quassnoi 2010-11-09 12:56:23

+0

此外,'inner'和'outer'是關鍵字 – 2015-11-08 12:58:55

0

首先,如果你有一個日期字段,你最好從日期中確定最新的記錄。

這將工作:

SELECT topic_id, object_id, title, url, date 
FROM topics earlier 
WHERE EXISTS 
    (SELECT newest.topic_id 
    FROM topics newest 
    WHERE newest.date  > earlier.date 
    AND newest.object_id = earlier.object_id) 

你選擇了其中存在具有相同的object_id和更近的日期另一條線。