我有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;但是我没有得到理想的结果,所以我显然做错了什么,但我不知道是什么。提前谢谢。
答案 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)
您可以使用COUNT
,HAVING
和模运算符的组合:
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