我正在使用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
答案 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)
我建议您使用SUM
和CASE
。
当成员在一个组中时,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
只需在一个组中找到成员即可。