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;
给出了两个结果在原来的表,但在结果表中只有一行由如意的标准,而不是两个由于某种原因显示。
如果您想要查看所有具有重复项的行,而不是每个行的一个实例,则需要将您的查询与原始表连接。
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
谢谢。它花了一段时间来测试它。有用。如果你解释为什么问题中的查询做了不同的事情,我将不胜感激。它分组 - 是的。它为什么只显示第一行?非常感谢。 – Haradzieniec
因为这就是'GROUP BY'所做的:它将具有相同值的所有行组合成一行。 – Barmar
当您想要获得特定列的总计时,您可以使用“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)
采取的索引的非常好的优点。
该查询应该做你想要的。你可以发布一些取得错误结果的样本数据吗? – Barmar
您可能选择比group by子句中列出的更多非聚合列;为获取所有列,请使用子查询 –