我花了几天的时间试图找出答案,但是没有运气!
我有这样的表:
user:
id, name
event:
id
userId
startAt
endAt
如何编写查询,以使所有用户获得以下信息:
这是我(失败的)尝试:
SELECT *
FROM user
LEFT JOIN event ON user.id = event.userId
WHERE
startAt IS NOT NULL AND endAt IS NOT NULL
OR event.userId IS NULL
这是sql小提琴
http://sqlfiddle.com/#!9/aa55cd
以上查询应返回3个用户。 ID为1的用户应被跳过,因为他们是。有没有结束日期的事件。
答案 0 :(得分:3)
您可以在相关子查询中使用NOT EXISTS
来查找“可用”用户:
SELECT *
FROM user u
WHERE NOT EXISTS (
SELECT *
FROM `event` e
WHERE e.userId=u.id
AND e.startAt IS NOT NULL
AND e.endAt IS NULL
)
id Name
-- -------
2 Michael
3 Jenny
4 June
答案 1 :(得分:1)
使用子查询消除事件中没有endAt
的用户
SELECT *
FROM user
LEFT JOIN event ON user.id = event.userId
WHERE user.id NOT IN (
SELECT userId
FROM event
WHERE endAt IS NULL)