我想刪除除了一行之外的所有行,但與PHP一起使用。如何刪除除SQL中的所有行外的所有行
我認爲這將是我的問題更簡單的解決方案,它是刪除重複的信息。
好吧......我剛剛意識到我已經做的是廢話。
基本上我有一個表(dev_discs),我想在'discReference'列中搜索重複項,然後刪除除了一個以外的所有項,從而剩下一行。
有沒有一個簡單的查詢來做到這一點?我在網上遇到過類似的情況,他們都很複雜......我不認爲它是一個非常複雜的場景。
我想刪除除了一行之外的所有行,但與PHP一起使用。如何刪除除SQL中的所有行外的所有行
我認爲這將是我的問題更簡單的解決方案,它是刪除重複的信息。
好吧......我剛剛意識到我已經做的是廢話。
基本上我有一個表(dev_discs),我想在'discReference'列中搜索重複項,然後刪除除了一個以外的所有項,從而剩下一行。
有沒有一個簡單的查詢來做到這一點?我在網上遇到過類似的情況,他們都很複雜......我不認爲它是一個非常複雜的場景。
不容易,AFAIK。對於PHP來說,它不應該太困難(但我可以想象使用SQL無法輕鬆完成這一任務)。
與原具有相同的結構創建一個新表:
CREATE TABLE dev_discs_noduplicates( ... );
取從原始表中的所有非重複數據與GROUP子句來消除重複:
SELECT * FROM dev_discs WHERE 1 GROUP BY dupe_col1,dupe_col2;
遍歷結果,並將其插入到新表:
INSERT INTO dev_discs_noduplicates ...;
刪除舊錶
DROP TABLE dev_discs;
重命名新表:
RENAME TABLE dev_discs_nodulicates TO dev_discs;
[編輯]
由於@xanatos理所當然地說在數據庫中可能存在的關係損失,這裏涉及SQL和PHP的替代解決方案。
首先,獲取唯一行:
SELECT id FROM dev_discs GROUP BY col1, col2;
在一個PHP數組說完這些,內爆,並在刪除查詢中使用:
DELETE FROM dev_discs WHERE (id) NOT IN (@arr);
這應該考慮到所有可能存在的問題護理。
與此同時,你失去了桌上所有的關係,你在桌上的ACL ...... – xanatos
@xanatos:是的,如果它們是外鍵和/或觸發器,它們也會丟失。我假設OP可以重新創建這些。另外,他沒有提到這些,所以我的回答也不包括它們。我很想知道你的解決方案,因爲我懷疑它是防彈的;)。 – mingos
這很簡單:-) http://www.kodyaz.com/articles/delete-duplicate-rows-using-row-number-partition-by-order-by.aspx您使用ROW_NUMBER()和CTE刪除重複。我沒有寫回應,因爲OP沒有說明他正在使用什麼SQL,我認爲那些不遵循他們問題的人不應該得到很好的答案。如果你願意,你可以從我和文章中偷取它:-) – xanatos
DELETE FROM discs dd WHERE EXISTS
(SELECT * FROM discs d2
WHERE d2.discReference = dd.discReference
AND d2.rownumber < dd.rownumber
);
「rownumber」是一個內部id,由您的DBMS提供。可以稱爲tid,oid。
在MySQL中,你不能使用你從中刪除的表中的select子查詢。 – mingos
這是什麼RDBMS?如果只有'MySQL'[這裏的答案之一應該工作](http:// stackoverflow。com/q/18932/73226),但MySQL對於在子查詢中引用要刪除的表很有趣。 –
你想做什麼?你想刪除一行中的所有重複項嗎?你想刪除一組行中的所有重複項嗎?你想刪除表中所有行的所有重複項嗎?你想刪除一個表的所有行保存1嗎? – xanatos
僅僅通過選擇查詢來創建刪除查詢似乎很簡單,然後只需選擇一個您想要保留的查詢即可。 –