【发布时间】:2019-10-23 11:20:54
【问题描述】:
我被一个查询困住了,我想做几件事: - 我有一张桌子,里面有一些活动,每个活动都有有限的人数可以申请 - 在其他表中,我记录了谁申请了哪个事件 - 在网站上,对用户,我只想显示他可以申请的事件(更准确地说,他没有申请的事件;一旦他申请,该事件应该不再对用户可见) AND/OR 申请人数少于 max_no_people (当活动已满时,无需向用户显示
我在另一个线程中从这里获得了帮助,但仅针对部分问题。 表格如下所示:
other_events (eventID, max_no_people, active)
event_applied (eventID, userID)
这里是查询:
SELECT count(event_applied.eventid) AS no_applied,
e.eventID, e.max_no_people, e.active
FROM other_events e
INNER JOIN
event_applied ON event_applied.eventID = e.eventID
LEFT JOIN
event_applied ea ON ea.eventID
AND event_applied.userID = :userID
WHERE ea.eventID IS NULL
AND e.active = 1
GROUP BY event_applied.eventID
HAVING (no_applied < max_no_people)
此查询工作正常 - 但是 - 对于除当前选定用户之外的所有其他用户。 假设您有 userID = 42(不在与 eventID = 123 配对的 events_applied 表中):
其他事件
eventID | max_no_people | active
--------|---------------|-------
21 | 5 | 1
在 events_applied 中
eventID | userID
--------|-------
123 | 10
123 | 11
123 | 12
123 | 13
123 | 14
查询将返回空行(因为事件已用完,您无法再申请),但如果您是 userID = 12(在 events_applied 表中且有 eventID 对),则结果将如下所示:
no_applied | e.eventID | e.max_no_people | e.active
-----------|-----------|-----------------|---------
**4** | 123 | 5 | 1
因此,该事件将是可见的,您将能够一次又一次地应用(我知道我必须添加一些额外的控件,但我稍后会解决)。
所以,问题在于这个查询以某种方式丢弃了当前用户的行并且没有将其添加到最终计数中。
有人吗? :)
【问题讨论】:
-
您说:一旦他申请,该事件应该不再对用户可见。所以对于
userID = 12,你不希望查询返回一个空的结果集,因为他已经申请了事件123? -
我想我说错了 - 一旦他申请,是的,该事件应该不再对用户可见。但它仍然可见并且计数仍然是 4(就像它不会计算您自己的应用程序一样)我在文本中进行了编辑和澄清