Как сделать этот запрос? - PullRequest
0 голосов
/ 01 июля 2018

Я потратил несколько дней, пытаясь понять это, но безуспешно!

У меня есть таблицы так:

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 пользователей. Пользователь с идентификатором 1 должен быть пропущен, так как он. есть событие без даты окончания.

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Используйте подзапрос, чтобы исключить пользователей, у которых есть события без 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.

0 голосов
/ 01 июля 2018

Вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...