2010-03-20 33 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