我有一個表PEOPLE,列'firstName''lastName'(varchars)和'刪除'(位)等。MySQL DELETE查詢條件
我想從此表中刪除具有屬性TRUE以便刪除的條目,但只有當它們與表中的另一個單獨條目共享其確切的firstName和lastName時纔有效。
換句話說,從表中刪除'刪除'的人,但只有當他們是重複的。
不知道如何做到這一點,特別是如何快速做到這一點。任何幫助表示讚賞,謝謝。
我有一個表PEOPLE,列'firstName''lastName'(varchars)和'刪除'(位)等。MySQL DELETE查詢條件
我想從此表中刪除具有屬性TRUE以便刪除的條目,但只有當它們與表中的另一個單獨條目共享其確切的firstName和lastName時纔有效。
換句話說,從表中刪除'刪除'的人,但只有當他們是重複的。
不知道如何做到這一點,特別是如何快速做到這一點。任何幫助表示讚賞,謝謝。
這裏是做的一個基本方式:
http://www.justin-cook.com/wp/2006/12/12/remove-duplicate-entries-rows-a-mysql-database-table/
基本上是:
1. GROUP BY
創建一個新表。
2.刪除舊錶。
3.重命名新表。
+1。一個非常好的替代 – niktrs
如果你的表中有一個唯一的主鍵(...取決於設計......),那麼這就是需要計算的條目occurrances一個可行的替代方案:
DELETE FROM people as A
WHERE deleted = 1
AND EXISTS (SELECT '1'
FROM people as B
WHERE B.id <> A.id
AND A.firstName = B.firstName
AND A.lastName = B.lastName)
這可能比計數行稍好一些。請注意,這個查詢可能會遇到前一個答案中可能出現的相同問題;具體來說,如果有兩個或更多'已刪除'行,並且沒有'未刪除',他們兩個都可能會被刪除(沒有行!)。如果查詢的意圖只是在存在「未刪除」等效行時刪除「已刪除」行,請將AND B.deleted = 0
作爲內部WHERE
子句的一部分添加。
太好了 - 這個可以讓我很容易'AND B.deleted = 0'解決,我懷疑提問者想要的,而另一個則不需要。 –
建議:使用A.id> B.id,因此所有比第一條記錄新的都將被刪除。也執行得更快。 – niktrs
@niktrs - 不幸的是,這假定只有後來(或更早)的id被「刪除」。根據設計和使用情況,這個假設可能有效也可能不會有效。但是,是的,否則,這可能會表現更好。 –
你怎麼知道哪個是重複的,哪個是主要記錄? –
可能重複[數據庫中的重複條目](http://stackoverflow.com/questions/5970329/duplicate-entries-in-db) – Neal
所有字段在同一個表中? –