2010-03-20 31 views
0

因此,我在使用MySQL查詢時遇到了一些問題(請參閱other question),並決定嘗試不同的方法。使用php在MySql中標記重複項(不刪除)

我有一個數據庫表有一些重複的行,我實際上可能需要將來的參考,所以我不想刪除。我正在尋找的是一種顯示沒有這些重複數據的數據,但不刪除它們的方法。我無法使用簡單的選擇查詢(如其他問題所述)。

所以我需要做的是寫一個代碼,執行以下操作: 1.通過我的數據庫表。 2.點「ip」列中的重複項。 3.將每個副本的第一個實例標記爲「0」(在名爲「duplicate」的列中),其餘爲「1」。

這種方式我可以以後只選擇行WHERE重複= 0。

注意:如果您的解決方案與SELECT查詢有關,請首先閱讀other question - 我不是僅僅使用GROUP BY/DISTINCT。

在此先感謝。

+0

它無論哪個記錄是第一:

SELECT t.ip, CASE WHEN @ip != t.ip THEN 0 ELSE 1 END AS duplicate, @ip = t.ip FROM TABLE t JOIN (SELECT @ip = NULL) r ORDER BY t.ip 

您可以通過在子查詢中使用它獲得來自獨立IP行的列表?如果確實如此,您如何確定哪些副本是第一個? – 2010-03-20 20:38:46

+0

實際上並不重要。只要我保留一個,並標記其餘的。 – 2010-03-20 20:46:56

+1

這不是一個正確答案嗎? http://stackoverflow.com/questions/2483492/mysql-query-select-distinct-column1-group-by-column2/2484691#2484691 – user187291 2010-03-20 20:49:05

回答

1

MySQL沒有任何排名/分析/窗口化功能,但你可以使用,而不是一個變量:

SELECT t.ip, 
     CASE 
      WHEN @ip != t.ip THEN @rank := 0 
      ELSE @rank := @rank + 1 
     END AS duplicate, 
     @ip = t.ip 
    FROM TABLE t 
    JOIN (SELECT @rank := 0, @ip = NULL) r 
ORDER BY t.ip 

ip值的第一次出現將在duplicate列具有零值;所有後續記錄的值都會遞增1。如果你不希望增加的數字,使用:

SELECT x.ip 
    FROM (paste either query in here) x 
WHERE x.duplicate = 0