【问题标题】:Showing all duplicates, side by side, in MySQL在 MySQL 中并排显示所有重复项
【发布时间】:2010-11-26 09:27:49
【问题描述】:

我有一张这样的桌子:

Table eventlog
user  |  user_group  | event_date |  event_dur.
----     ----------    ---------     ----------
xyz         1           2009-1-1        3.5
xyz         2           2009-1-1        4.5
abc         2           2009-1-2        5
abc         1           2009-1-2        5

请注意,在上述示例数据中,唯一可靠的是日期和用户。通过一个 90% 归咎于我的过度网站,我设法让用户复制他们的日常条目。在某些情况下,副本旨在更新其持续时间,在其他情况下,他们试图更改他们当天使用的 user_group,而在其他情况下两者兼而有之。

幸运的是,我有一个相当强烈的想法(因为这是对旧系统的更新),哪些记录是正确的。 (基本上,这一切都是为了尝试将旧数据库与新数据库无缝合并)。

不幸的是,我或多或少必须手动执行此操作,否则可能会丢失仅存在于一侧而不存在于另一侧的数据....

长话短说,我正在尝试找出正确的 MySQL 查询,以返回在任何给定日期为用户提供多个条目的所有记录。我一直在用 GROUP BY 和 HAVING 苦苦挣扎,但我能得到的最好的结果是每个重复项的两个重复项之一的列表,如果我确定它是错误的,那就太好了。

这是我最近的一次:

SELECT *
FROM eventlog
GROUP BY event_date, user
HAVING COUNT(user) > 1
ORDER BY event_date, user

对此的任何帮助都将非常有用。如果需要,我有每组重复项的用户/日期列表,所以我可以手动删除所有 400 个,但我更愿意一次看到它们。

谢谢!

【问题讨论】:

  • 我遇到了类似的问题,并通过从一组查询(例如您的)中选择输出到一个新表中来解决它,然后丢弃原始数据。
  • 如果我UNION他们重新在一起会有所帮助。但是我要一个一个地去确定哪些要保留,哪些要删除。

标签: mysql group-by duplicates


【解决方案1】:

我认为这可行(未经测试)

SELECT  *
FROM    eventlog e1
WHERE   1 <
(
    SELECT  COUNT(*)
    FROM    eventlog e2
    WHERE   e1.event_date = e2.event_date
    AND     e1.user = e2.user
)
-- AND [maybe an additionnal constraint to find the bad duplicate]
ORDER BY event_date, user;
;

【讨论】:

    【解决方案2】:

    您可以使用 GROUP_CONCAT 函数列出重复项的所有字段值,但您仍然可以为每组获取一行。

    【讨论】:

      【解决方案3】:

      这行得通吗?

      SELECT event_date, user
      FROM eventlog
      GROUP BY event_date, user
      HAVING COUNT(*) > 1
      ORDER BY event_date, user
      

      让我失望的是您拥有的 COUNT(user) 子句。

      【讨论】:

      • 我认为我必须在 COUNT() 中有一些东西来指定哪一列有重复数据(哪一列的重复数据不好?),无论如何,现在测试......跨度>
      • 大鼠,结果相同。仍然只是得到一组重复项,而不是两者。我知道 GROUP BY 有问题
      • 您的日期字段是否可能包含时间戳值(例如,下午 4:00)?这可能会排除看起来像一对的东西。
      • 如果是这样,它不会出现在 phpmyadmin 中,这是我用来执行此操作的。我会使用 DATE() 函数再次尝试确定。
      • 不走运。 COUNT 是否有可能只返回集合中的成员,这些成员在计数时高于 1? (与计数大于 1 的集合的所有成员相反)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-29
      • 2016-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多