【问题标题】:MySQL query to get all duplicates based on values from two columnsMySQL查询根据两列的值获取所有重复项
【发布时间】:2017-01-01 10:38:10
【问题描述】:

当我执行时

select *, count(*) c 
FROM mytable 
GROUP BY col3, col4 
HAVING c > 1
order by col4, col3;

我期望获得对于任何值的行,在选择中,至少有两个等效项(col3、col4)。 但是,我得到的结果是只有一行出现一些 col3 值。谁能解释一下为什么?

换句话说,我正在尝试构建一个查询,以获取所有行的对 (col3, col4) 出现不止一次。

意外结果的例子是这样的:

id - col1 - col2 - col3 - col4 - c       
123- val1  val123   43   val444  2
456- val14  val52   45   val444  2

列 col3 中的 43 永远不会出现在结果中,但我希望如此。否则该行不应出现在结果中。

正确,

select * from ukberu1m where col3=43 and col4=val444;

在原始表中给出两个结果,但在结果表中,如意标准只显示一行,而不是出于某种原因显示两个。

【问题讨论】:

  • 那个查询应该做你想做的事。你能发布一些得到错误结果的示例数据吗?
  • 您选择的非聚合列可能比 group by 子句中列出的多;要获取所有列,请使用子查询

标签: mysql sql select key


【解决方案1】:

如果您想查看所有具有重复项的行,而不仅仅是每个行的一个实例,您需要将查询与原始表连接起来。

SELECT t1.*
FROM mytable AS t1
JOIN (SELECT col3, col4
      FROM mytable
      GROUP BY col3, col4
      HAVING COUNT(*) > 1) AS t2
ON t1.col3 = t2.col3 AND t1.col4 = t2.col4
ORDER BY col4, col3

【讨论】:

  • 谢谢。花了一段时间来测试它。有用。如果您解释为什么问题中的查询会做不同的事情,我将不胜感激?它分组 - 是的。为什么它只显示第一行?非常感谢。
  • 因为GROUP BY 就是这样做的:它将所有具有相同值的行合并为一行。
  • 当您想要获取特定列的总计时,您可以使用GROUP BY。就像如果你想按日期计算行数,你可以使用SELECT DATE(timestamp) as date, COUNT(*) ... GROUP BY date
  • 如果您这样做,您不会期望每天获得多行,对吗?那你为什么要在查询中得到多行呢?
【解决方案2】:

假设id 每行都是唯一的,另一种方法是:

select t.*
from mytable t
where exists (select 1
              from mytable t2
              where t2.col3 = t.col3 and t2.col4 = t.col4 and t2.id <> t.id
             );

这种方法的优点是它可以很好地利用mytable(col3, col4)上的索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 2019-05-20
    • 2016-04-05
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多