Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用php在MySql中标记重复项(不删除)_Php_Mysql_Duplicates - Fatal编程技术网

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

使用php在MySql中标记重复项(不删除),php,mysql,duplicates,Php,Mysql,Duplicates,因此,我在使用MySQL查询时遇到了一些问题(请参阅),并决定尝试另一种方法 我有一个数据库表,其中有一些重复的行,我实际上可能需要这些行作为将来的参考,所以我不想删除它们。我要寻找的是一种显示数据的方法,不需要重复,但不需要删除它们。我不能使用简单的select查询(如另一个问题中所述) 因此,我需要做的是编写一个代码,执行以下操作: 1.检查我的数据库表。 2.在“ip”列中查找重复项。 3.将每个副本的第一个实例标记为“0”(在名为“duplicate”的列中),其余实例标记为“1” 这样

因此,我在使用MySQL查询时遇到了一些问题(请参阅),并决定尝试另一种方法

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

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

这样,我以后只能选择duplicate=0的行

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


提前感谢。

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

哪张唱片是第一张重要吗?如果是的话,你如何确定哪一个副本是第一个呢?实际上并不重要。只要我留着一个,其余的留着记号。这不是一个正确的答案吗@几乎没有。还有一个最终成功了。谢谢大家的努力@天哪,你的回答很有帮助。