mysql选择值发生的记录

时间:2014-09-29 19:18:54

标签: mysql sql count

我希望你能帮助我解决这个问题。我一直在寻找设置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中完成。 :)

2 个答案:

答案 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