MySQL查询获得基于值的所有副本从两列

问题描述:

当我执行MySQL查询获得基于值的所有副本从两列

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 

43列COL3从未发生的结果,但我期望的那样。否则这行不应该在结果中。

正确,

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

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

+1

该查询应该做你想要的。你可以发布一些取得错误结果的样本数据吗? – Barmar

+0

您可能选择比group by子句中列出的更多非聚合列;为获取所有列,请使用子查询 –

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

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 
+0

谢谢。它花了一段时间来测试它。有用。如果你解释为什么问题中的查询做了不同的事情,我将不胜感激。它分组 - 是的。它为什么只显示第一行?非常感谢。 – Haradzieniec

+1

因为这就是'GROUP BY'所做的:它将具有相同值的所有行组合成一行。 – Barmar

+1

当您想要获得特定列的总计时,您可以使用“GROUP BY”。就像如果你想按日期计算行一样,你可以使用'SELECT DATE(timestamp)作为日期,COUNT(*)... GROUP BY日期'。 – Barmar

假设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)采取的索引的非常好的优点。