SQL查询返回分配了奇数个用户的事件

时间:2015-04-25 18:20:42

标签: mysql sql database

我有5个表 - 用户,组,事件,users_groups_link,users_events_link。像这样:

users
user_id

groups
group_id

events
event_id

users_groups_link
user_id
group_id

users_events_link
user_id
event_id

每个事件都分配了2个或4个组,每个组包含8-11个用户。 user_id = 1是组空缺。 我想确保每个事件都有偶数用户,因此我尝试创建一个返回包含奇数用户的所有事件的查询。到目前为止我有这个:

SELECT user_id,event_id 
FROM users,groups,events,users_events_link,users_groups_link
WHERE users.user_id=users_events_link.user_id
AND events.event_id=users_events_link.event_id
AND users.user_id=users_groups_link.user_id
AND groups.group_id=users_groups_link.group_id
AND user_id <> 1

返回分配给它们的所有事件和用户(通过其主机组),如下所示:

user_id         event_id
56              1001
34              1001
76              1001
45              1001
87              1001
88              1001
54              1001
4               1001
63              1002
69              1002
77              1002
etc.

现在我想通过仅返回分配给它们的奇数个用户的事件来进一步细化该查询,即在右手列中具有id的事件重复奇数次。然后可以通过完全删除users_id列并为包含奇数个用户的每个事件返回一个事件id来进一步完善它。

我尝试过使用&#34; count()&#34; &#34; group by&#34;但是我没有得到理想的结果,所以我显然做错了什么,但我不知道是什么。提前谢谢。

2 个答案:

答案 0 :(得分:0)

由于您坚持要更改当前查询,我这样做了,但是有一种更简单的方法可以实现此结果 - 没有派生表并且更清晰 - 使用JOINs

Modulo operation正是您要找的。在SQL中它是%

此查询会为您提供奇数event_id's的{​​{1}},并告诉您每个特定事件的基数。

users

如果您有不同的SELECT event_id, COUNT(DISTINCT user_id) FROM( SELECT user_id,event_id FROM users,groups,events,users_events_link,users_groups_link WHERE users.user_id=users_events_link.user_id AND events.event_id=users_events_link.event_id AND users.user_id=users_groups_link.user_id AND groups.group_id=users_groups_link.group_id AND user_id <> 1 ) foo GROUP BY event_id HAVING COUNT(DISTINCT user_id) % 2 = 1 ,则可以跳过user_id's关键字。我不熟悉你的桌子模式 - 比抱歉更安全。

答案 1 :(得分:0)

您可以使用COUNTHAVING和模运算符的组合:

SELECT event_id, COUNT(DISTINCT user_id) as c
FROM users,groups,events,users_events_link,users_groups_link
WHERE users.user_id=users_events_link.user_id
AND events.event_id=users_events_link.event_id
AND users.user_id=users_groups_link.user_id
AND groups.group_id=users_groups_link.group_id
AND user_id <> 1
GROUP BY event_id
HAVING c % 2 = 1