比如說有個name列和一個eamil列,如果資料庫裡面有條記錄的這兩列的值相同(我說的是這條記錄的對應的那兩列的值相同,並不是同一條記錄裡面兩列值相同)的話就自動刪除其他多餘的列而保留最新的那一條(也就是ID最小的那個,ID是一個自增主鍵)
——————————————————
也就是說表裡面有兩條記錄的name都是admin,email都是abc@163.com,我只想保留其中一條,這該怎麼做
回複內容:
其實你會用英文搜尋的話。可以很方便在stack overflow上 找到相關的資訊 真的學CS的就不要用百度了 用google你會發現一個不一樣的世界的
隨便貼一個
sql - How can I remove duplicate rows?
稍微講一下其中一個思路(裡面有很多很好的答案 你可以自己去看)
就是做一個group by 保留其中id 最大的(你說自增長 id最大的應該就是最新的)就可以了
具體sql query 可以這樣寫
delete from test where id not in(select name,email,max(id) from test group by name,email having id is not null)
distinct如果要保留id的最小值,例如:
資料:
執行sql:select count(*) as count ,name,id from ceshi group by name
最後要刪除的sql為:delete from ceshi where id not in (select count(*) as count ,name,id from ceshi group by name)最後要刪除的sql為:delete from ceshi where id not in (select count(*) as count ,name,id from ceshi group by name)
如果想保留id的最大值:
簡單的辦法是:delete from ceshi where id not in (select count(*) as count ,name,id from (select * from ceshi order by id desc) group by name)distinct其實非常的簡單,只需要把你這張表當成兩張表來處理就行了。
DELETE p1 from TABLE p1, TABLE p2 WHERE p1.name = p2.name AND p1.email = p2.email AND p1.id < p2.id;
這裡有個問題,題主說保留最新的那一條(也就是ID最小的那個),既然是遞增,最新的不應該是最大的那條嗎?
上面的的語句,p1.id < p2.id,所以擷取到的是id最大的,因為p1.id小於p2.id就會被刪除,只有最大的值不滿足。如果要擷取id最小的那個,只需要把'<'改成'>'即可。
當然是用group by,count可以更精準控制重複n次的情況。不過目測樓主需求應該只要把重複的刪掉,保留最新的就可以了。DELETE FROM table WHERE id not in ( SELECT
tb.id FROM ( SELECT tmp.* FROM table tmp ) tb GROUP BY tb.field1, tb.field2,… );
table是表名,field是要去重的欄位。建立一個表,設定name,email為唯一索引,然後重新插入舊錶資料