我有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来进一步细化它。
我试过使用"count()“和"group”,但是没有得到预期的结果,所以我显然做错了什么,但我不知道是什么。提前谢谢。
发布于 2015-04-25 18:31:01
您可以使用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 发布于 2015-04-25 18:25:43
由于您坚持要更改当前的查询,所以我这样做了,但是使用JOINs有更简单的方法来实现这个结果--没有派生表,也没有更清楚的结果。
模数运算是你要找的东西。在SQL中,它是%。
此查询将给出具有奇数event_id's的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,可以跳过DISTINCT关键字。我不熟悉你们桌子的模式--安全总比抱歉好。
https://stackoverflow.com/questions/29868945
复制相似问题