首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL查询返回具有分配给它们的奇数用户的事件

SQL查询返回具有分配给它们的奇数用户的事件
EN

Stack Overflow用户
提问于 2015-04-25 18:20:42
回答 2查看 144关注 0票数 0

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

代码语言:javascript
复制
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是一个团体空缺。我想确保每个事件都有偶数的用户,所以我尝试创建一个返回包含奇数用户的所有事件的查询。

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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”,但是没有得到预期的结果,所以我显然做错了什么,但我不知道是什么。提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-25 18:31:01

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

代码语言:javascript
复制
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 
票数 0
EN

Stack Overflow用户

发布于 2015-04-25 18:25:43

由于您坚持要更改当前的查询,所以我这样做了,但是使用JOINs有更简单的方法来实现这个结果--没有派生表,也没有更清楚的结果。

模数运算是你要找的东西。在SQL中,它是%

此查询将给出具有奇数event_id'susers,并告诉您它们在每个特定事件上的基数。

代码语言:javascript
复制
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关键字。我不熟悉你们桌子的模式--安全总比抱歉好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29868945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档