我有三个表结构如下(简化):
users
-----
id
purchases
---------
id
user_id
events
------
id
purchase_id
starts_on (datetime)
我想选择所有在过去某个日期之前发生过事件但未来没有事件的用户。您可以将此视为提出问题,“我的哪些用户之前通过参加活动与我的公司合作,但现在不再?”
此查询是在Rails中生成的,我已将其清理为如下所示:
SELECT DISTINCT `users`.id FROM `users`
LEFT OUTER JOIN `events` ON events.user_id = users.id
LEFT OUTER JOIN `purchases` ON `purchases`.id = `events`.purchase_id
WHERE events.starts_on <= '2013-07-15' AND NOT events.starts_on >= '2013-08-12'
LIMIT 0, 30;
虽然此查询成功检索了在第一个日期参数之前具有事件的用户,但它仍然包括具有将来开始的事件的用户,这不是我想要的。看来我查询的“AND NOT”部分没有按预期工作。
我最初怀疑问题是使用LEFT OUTER JOIN而不是INNER JOIN,但改变这个没有区别。
帮助表示赞赏。
答案 0 :(得分:0)
我认为你需要一个小组功能。
SELECT DISTINCT `users`.id FROM `users`
LEFT OUTER JOIN `events` ON events.user_id = users.id
LEFT OUTER JOIN `purchases` ON `purchases`.id = `events`.purchase_id
WHERE events.starts_on <= '2013-07-15' or events.starts_on >= '2013-08-12'
group by `users`.id
having min(starts_on) <= '2013-07-15' and max(starts_on) < '2013-08-12'
LIMIT 0, 30;