查询以返回属于组的成员数以及不在一个语句中的成员数

时间:2018-01-25 18:22:41

标签: mysql sql

我正在使用MySQL。我基本上只想要两个数字:属于任意数量的组的成员数量和没有组的成员数量。目前,我使用两个查询来获取不存在的数字的第一个数量,然后是那些拥有的数字。但是希望有更好的方法。

USING PERIODIC COMMIT
LOAD CSV FROM 'file:///foo.csv' AS line
CREATE (:Person { name: line[1], address: line[2] });

目前我在做:

 members: id, name,gender
 groups: id,name
 member_groups:id,groupid,memberid

3 个答案:

答案 0 :(得分:1)

我会选择直方图直方图方法:

select num_groups, count(*) as num_members_with_this_many_groups
from (select m.id, count(mg.id) as num_groups
      from members left join
           members_groups mg 
           on mg.id = m.memberid
      group by m.id
     ) m
group by num_groups;

可以很容易地修改0或0组以上的逻辑,但我通常会发现所有数字的列表更有用。

答案 1 :(得分:1)

我建议您使用SUMCASE。 当成员在一个组中时,CASE将返回1,而当成员在一个组中时,SUM将返回0,SELECT SUM(CASE WHEN id in (SELECT memberid FROM member_groups) THEN 1 ELSE 0 END) AS 'in_group' SUM(CASE WHEN id not in (SELECT memberid FROM member_groups) THEN 1 ELSE 0 END) AS 'not_in_group' FROM members 将获得总金额。

{{1}}

答案 2 :(得分:1)

您可以使用IN子句检查成员是否在某个群组中,然后计算:

select is_in_a_group, count(*)
from
(
  select id in (select memberid from member_groups) as is_in_a_group
  from members m
) looked_up
group by is_in_a_group;

Rextester演示:http://rextester.com/IYY77021

当然,您可以使用EXISTS子句完全相同。如果优化器是好的,执行计划将是相同的。

此声明应该非常快,因为使用IN / EXISTS只需在一个组中找到成员即可。