2011-09-10 283 views
4

我想刪除除了一行之外的所有行,但與PHP一起使用。如何刪除除SQL中的所有行外的所有行

我認爲這將是我的問題更簡單的解決方案,它是刪除重複的信息。

好吧......我剛剛意識到我已經做的是廢話。

基本上我有一個表(dev_discs),我想在'discReference'列中搜索重複項,然後刪除除了一個以外的所有項,從而剩下一行。

有沒有一個簡單的查詢來做到這一點?我在網上遇到過類似的情況,他們都很複雜......我不認爲它是一個非常複雜的場景。

+0

這是什麼RDBMS?如果只有'MySQL'[這裏的答案之一應該工作](http:// stackoverflow。com/q/18932/73226),但MySQL對於在子查詢中引用要刪除的表很有趣。 –

+0

你想做什麼?你想刪除一行中的所有重複項嗎?你想刪除一組行中的所有重複項嗎?你想刪除表中所有行的所有重複項嗎?你想刪除一個表的所有行保存1嗎? – xanatos

+0

僅僅通過選擇查詢來創建刪除查詢似乎很簡單,然後只需選擇一個您想要保留的查詢即可。 –

回答

0

不容易,AFAIK。對於PHP來說,它不應該太困難(但我可以想象使用SQL無法輕鬆完成這一任務)。

  1. 與原具有相同的結構創建一個新表:

    CREATE TABLE dev_discs_noduplicates( ... );

  2. 取從原始表中的所有非重複數據與GROUP子句來消除重複:

    SELECT * FROM dev_discs WHERE 1 GROUP BY dupe_col1,dupe_col2;

  3. 遍歷結果,並將其插入到新表:

    INSERT INTO dev_discs_noduplicates ...;

  4. 刪除舊錶

    DROP TABLE dev_discs;

  5. 重命名新表:

    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); 

這應該考慮到所有可能存在的問題護理。

+0

與此同時,你失去了桌上所有的關係,你在桌上的ACL ...... – xanatos

+0

@xanatos:是的,如果它們是外鍵和/或觸發器,它們也會丟失。我假設OP可以重新創建這些。另外,他沒有提到這些,所以我的回答也不包括它們。我很想知道你的解決方案,因爲我懷疑它是防彈的;)。 – mingos

+0

這很簡單:-) http://www.kodyaz.com/articles/delete-duplicate-rows-using-row-number-partition-by-order-by.aspx您使用ROW_NUMBER()和CTE刪除重複。我沒有寫回應,因爲OP沒有說明他正在使用什麼SQL,我認爲那些不遵循他們問題的人不應該得到很好的答案。如果你願意,你可以從我和文章中偷取它:-) – xanatos

0
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。

+0

在MySQL中,你不能使用你從中刪除的表中的select子查詢。 – mingos