在 MySQL 中按多列获取重复行

Posted

技术标签:

【中文标题】在 MySQL 中按多列获取重复行【英文标题】:Getting duplicate rows by several columns in MySQL 【发布时间】:2013-06-28 14:59:10 【问题描述】:

我正在尝试按大表中的几列(近 18 000 行)搜索重复行。问题是查询需要很多时间,我试过这个:

 SELECT * FROM table_name a, table_name b 
 WHERE a.col1 = b.col1 
 AND a.col2 = b.col2 
 AND a.col3 = b.col3
 AND a.col4 = b.col4 
 AND a.id <> b.id

还有这个:

SELECT *
FROM table_name 
WHERE col1 IN (
    SELECT col1 
    FROM table_name 
    GROUP BY col1 
    HAVING count(col1) > 1
    )
AND col2 IN (
    SELECT col2
    FROM table_name 
    GROUP BY col2
    HAVING count(col2) > 1
    )
AND col3 IN (
    SELECT col3
    FROM table_name 
    GROUP BY col3
    HAVING count(col3) > 1
    )
AND col4 IN (
    SELECT col4
    FROM table_name 
    GROUP BY col4
    HAVING count(col4) > 1
    )

他们都工作,但太慢了。有什么想法吗?

【问题讨论】:

我不明白为什么 Siphon 尝试使用 group by having count &gt;1 对您不起作用。您可以发布示例数据和期望的结果吗? 他希望返回每一行。 group by 会给你一个重复的,但不是其他相同的行。因此,如果将 4 行分组在一起,那么 group by 将仅返回 1 行。这对每个人都不起作用,至少对他不起作用。 【参考方案1】:

您可以尝试使用一个联合 GROUP BY 语句,例如:

SELECT * FROM table_name
    GROUP BY col1, col2, col3, col4
    HAVING count(*) > 1

至少,它看起来会更干净。

编辑

将所有结果作为上一列的子集返回:

SELECT *
FROM table_name 
WHERE col4 IN (
  SELECT col4
  FROM table_name 
  WHERE col3 IN (
    SELECT col3
    FROM table_name 
    WHERE col2 IN (
      SELECT col2
      FROM table_name
      WHERE col1 IN (
        SELECT col1
        FROM table_name
        GROUP BY col1
        HAVING count(col1) > 1
        )
      )
    )

从概念上讲,这应该会在更快的执行时间内为您提供所有结果。

【讨论】:

感谢您的回答,但这并不能解决我的任务。我需要这些重复项,但不需要将它们分组。 我的错误。听起来您想查看是否有重复项,而不是返回所有结果。 我唯一的其他建议是使用子查询,在匹配列时减少总结果。因此,匹配 col1,然后从 col1 的结果中匹配 col2。这将避免需要为每一列匹配所有 18000 行。 查看我的编辑以了解我的意思。如果您首先定位已知没有那么多重复项的列,则可以使此运行更快。所以,最远的嵌套选择应该有尽可能少的重复。 感谢您的回复,我试过了,但它根本不工作,它冻结了一个无限循环。我尝试了此查询的“精简版”版本 - 按一列选择重复项,但它也不起作用,非常奇怪 - SELECT * FROM table WHERE col1 IN (SELECT col1 FROM table GROUP BY col1 HAVING count(col1) > 1)跨度>

以上是关于在 MySQL 中按多列获取重复行的主要内容,如果未能解决你的问题,请参考以下文章

如何在数据框中聚合具有多列的重复行[重复]

在具有重复行的 SQL Server 表中按组查找行号

在Python中按日期合并行和求和值[重复]

在 Python Pandas 中删除多列中的所有重复行

基于具有列表值的多列删除数据框中的重复行[重复]

如何在 MySQL Select 语句中按多列分组