我希望你能帮助我解决这个问题。我一直在寻找设置MySQL查询的方法,根据特定值出现的次数选择行,但到目前为止还没有运气。我很确定我需要在某处使用count(*),但我只能找到如何计算所有值或所有不同的值,而不是计算所有出现的值。
我有一张桌子:
info setid
-- --
A 1
B 1
C 2
D 1
E 2
F 3
G 1
H 3
我需要的是一个查询,它将选择setid出现一定数量(x)次的所有行。
所以使用x = 2应该给我
C 2
E 2
F 3
H 3
因为setIds 2和3都出现了两次。使用x = 1或x = 3不应该给出任何结果,选择x = 4应该给我
A 1
B 1
D 1
G 1
因为只有setid 1出现4次。
我希望你们能帮助我。在这一点上,我一直在寻找答案,以至于我甚至不确定这可以在MySQL中完成。 :)
答案 0 :(得分:1)
select * from mytable
where setid in (
select setid from mytable
group by setid
having count(*) = 2
)
您可以在子查询的having count(*)
部分的表中指定setid需要出现的次数
答案 1 :(得分:0)
考虑以下使用不相关子查询的语句:
SELECT ... FROM t1 WHERE t1.a IN(SELECT b FROM t2); 优化器将语句重写为相关子查询:
SELECT ... FROM t1 WHERE EXISTS(SELECT 1 FROM t2 WHERE t2.b = t1.a); 如果内部和外部查询分别返回M行和N行,则执行时间变为O(M×N),而不是O(M + N),就像对于不相关的子查询一样。
但是这次Fuzzy Tree解决方案中的子查询是完全多余的:
SELECT
set_id,
GROUP_CONCAT(info ORDER BY info) infos
COUNT(*) total
FROM
tablename
GROUP_BY set_id
HAVING COUNT(*) = 2