使用php在MySql中标记重复(不删除)

时间:2010-03-20 20:32:46

标签: php mysql duplicates

所以,我在MySQL查询方面遇到了一些问题(参见other question),并决定采用不同的方法。

我有一个包含一些重复行的数据库表,我实际上可能需要这些行供将来参考,所以我不想删除。我正在寻找的是一种显示数据的方法,没有那些重复,但没有删除它们。我不能使用简单的选择查询(如另一个问题中所述)。

所以我需要做的是编写执行以下操作的代码: 1.浏览我的数据库表。 2.在“ip”列中找到重复项。 3.将每个副本的第一个实例标记为“0”(在名为“duplicate”的列中),其余的标记为“1”。

这样我以后可以只选择行WHERE duplicate = 0。

注意:如果您的解决方案与SELECT查询相关,请首先阅读此other question - 这是我不仅仅使用GROUP BY / DISTINCT的原因。

提前致谢。

1 个答案:

答案 0 :(得分: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 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行的列表:

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