sql-如何进行此查询?

时间:2018-07-01 14:01:59

标签: mysql sql postgresql

我花了几天的时间试图找出答案,但是没有运气!

我有这样的表:

user:
id, name

event:
id
userId
startAt
endAt

如何编写查询,以使所有用户获得以下信息:

  • 未分配事件
  • 或具有确实已开始和结束(已完成)的事件
  • 并且没有没有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的用户应被跳过,因为他们是。有没有结束日期的事件。

2 个答案:

答案 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
)

Demo.

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)

SqlFiddle.