1

我有一张这样的桌子:

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 个,但我更愿意一次看到它们。

谢谢!

4

3 回答 3

1

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

于 2009-09-08T06:45:49.967 回答
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;
;
于 2009-09-08T08:08:47.170 回答
1

这行得通吗?

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

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

于 2009-09-08T04:52:58.543 回答