【问题标题】:SQL query returning events with an odd number of users assigned to themSQL 查询返回分配给奇数用户的事件
【发布时间】:2015-04-26 02:42:09
【问题描述】:

我有 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 by”,但没有得到想要的结果,所以我显然做错了,但我不知道是什么。提前致谢。

【问题讨论】:

  • 你想要的结果是?

标签: mysql sql database


【解决方案1】:

您可以使用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 

【讨论】:

  • 美丽。我试过了,效果很好。正是我想要的。再次感谢!
  • 不客气。也许您将此答案标记为已接受,以便其他寻找相同内容的人可以更轻松地找到它?
【解决方案2】:

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

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

此查询将为您提供具有奇数个 usersevent_id's,并告诉您它们在每个特定事件上的基数。

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 关键字。我不熟悉您的表的架构 - 比抱歉更安全。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多