2012-09-27 57 views
0

我已经摆弄了大约20分钟,尽管我可能会在这里得到一些帮助。我有两张桌子,以多对一的关系。用户(一个)和事件(很多)。这些表格,简化的,是这样的:总计组选择(mySQL)

users 
----------- 
user_id 
group_id 

events 
----------- 
user_id 

我想提出一份报告,将显示用户的数量与至少一个事件,每组。这样的结果集将有希望的样子:

group_id users_with_at_least_one_event 
1   689 
2   312 

回答

2
SELECT group_id, count(*) users_with_at_least_one_event 
FROM 
(
SELECT u.user_id, u.group_id, count(*) as event_count 
FROM users u 
     JOIN events e 
     ON u.user_id = e.user_id 
GROUP BY u.user_id, u.group_id 
HAVING count(*) > 1 
) sub 
GROUP BY group_id 
+0

这是有效的,并且具有允许我说“多于3个事件”的优点 - 尽管它确实需要将表名添加到某些列名以消除歧义 – Will

+0

哦,对不起,你是对的。我忘记了将字段与表名别名前缀。很高兴它对你有效。 – Tom

+0

我修正以摆脱歧义。 – Tom

0

尝试

select users.group_id, count(distinct users.user_id) as users_with_at_least_one_event 
from 
users, events 
where users.user_id = events.user_id 
group by users.group_id 
+0

我认为这是不正确的,因为它返回30K +,即使该组有2700个成员。 – Will

+0

在查询中增加了'distinct',尝试一下。 –

+0

这只是从事件表中给出了每个组中用户的数量。 – Tom

0
SELECT users.group_id, COUNT(*) FROM users 
WHERE users.user_id IN (SELECT events.user_id FROM events) 
+0

这只是返回事件表中的用户列表。 – Tom

0
SELECT group_id, COUNT(users.user_id) AS users_with_at_least_one_event, 
FROM users, events 
WHERE users.user_id = events.user_id 
GROUP BY group_id 

可能?

+0

这只是从事件表中给出了每个组中用户的数量。 – Tom