id class count day
1 2 5 5
2 2 4 5
3 2 4 5
3 2 4 5
4 2 5 3
4 1 5 3
4 2 5 3
所以我有一个基于多列查找所有重复项的查询,但是,这也会返回id,而不是所有条目都是重复的。 在上面的示例中,查询应该只显示/计数id 3,因为所有id为3的条目都是重复的。尽管id 4也有重复,但它不应该显示,因为它有另一个唯一的条目。
知道怎么做吗?
答案 0 :(得分:1)
如果您需要包含id
的行,其中没有行具有相同的id
和唯一行值,请使用NOT IN
和HAVING
select *
from your_table t1
where t1.id not in(
select id
from your_table
group by id, class, count, day
having count(*) = 1
)
答案 1 :(得分:1)
您可以使用此查询:http://sqlfiddle.com/#!9/1a2536/8
select id
from test
group by id
having count(distinct id,class,count,day) = 1 and count(*)>1
如果不同的总数为1且总行数为>,则按ID对每行进行分组并计算该组具有的行数。 1,此id只有重复的行。
答案 2 :(得分:-1)
这很容易,快速说明一下,列出一个列数非常糟糕:
SELECT id, class, `count`,day, COUNT(*)
FROM myTable
GROUP BY id, class, `count`,day
HAVING COUNT(*) > 1
编辑:我误解了这个问题所以这是我的解决方案:
SELECT test.id, test.class, test.count, test.day , count(*), t.countID
FROM (SELECT id, Count(id) AS countID FROM test GROUP BY id ) t
INNER JOIN test on t.id = test.id
GROUP BY test.id, test.class, test.count, test.day
HAVING Count(*) > 1 AND t.countID = count(*)
答案 3 :(得分:-1)
我想出了这个:
SELECT *
FROM (SELECT id,
Count(id) AS matched
FROM test
GROUP BY id,
class,
count,
day) t
GROUP BY id , matched
HAVING Count(id) = 1
AND matched >= 2
可能有一种更有效的方法,但这种方式更容易理解,首先我们按每列分组来查找重复数据。然后,第一部分消除了实际上具有不同变体的条目,然后我们只保留实际上只有重复的行。
编辑:与“only_full_group_by”模式兼容