Я думаю, что я довольно близко отношусь к этому запросу, но, похоже, не могу его взломать, и я не уверен, есть ли у меня самый эффективный подход.
Я пытаюсь найти день, когда пользователь не забронирован из ряда дат, где они бронируются.
Подумайте о кадровом планировании. Мне нужно найти, кто будет работать во вторник, и работает в другие дни на этой неделе.
В настоящий момент мой запрос выглядит следующим образом
SELECT employees.uid, name, date FROM employees LEFT JOIN storelocation ON employees.uid = storelocation.uid LEFT JOIN schedule ON emplyees.uid = schedule.uid WHERE slid =9308 AND date BETWEEN '2009-11-10' AND '2009-12-20' AND NOT EXISTS ( SELECT uid FROM schedule WHERE date = '2009-11-11' )
Если я не включу "Не существует", я получаю 1500 результатов Если я использую только форму "Не существует", я получаю 200 результатов, поэтому оба этих запроса работают независимо. Однако мой запрос, как я написал, возвращает 0 результатов.
Возможно, вы захотите попробовать что-то большее:
SELECT employees.uid, name, date
FROM users
LEFT JOIN storelocation ON employees.uid = storelocation.uid
LEFT JOIN schedule ON emplyees.uid = schedule.uid
WHERE slid =9308
AND date BETWEEN '2009-11-10' AND '2009-12-20'
AND employees.uid NOT IN (
SELECT uid
FROM schedule
WHERE date = '2009-11-11'
)
Проблема в том, что ваш NOT EXISTS
не коррелирован, и вы не сможете с этим справиться, не используя псевдонимы таблиц:
SELECT e.uid,
e.name,
s.date
FROM EMPLOYEES e
LEFT JOIN STORELOCATION sl ON sl.uid = e.uid
LEFT JOIN schedule s ON s.uid = e.uid
AND s.date BETWEEN '2009-11-10'AND '2009-12-20'
WHERE slid = 9308
AND NOT EXISTS (SELECT NULL
FROM SCHEDULE t
WHERE t.uid = e.uid
AND t.date = '2009-11-11')
SELECT
в предложении EXISTS
ничего не делает - вы можете использовать EXISTS( SELECT 1/0 ...
, что должно привести к ошибке "не может делить на ноль". Но это не будет... EXISTS
возвращает true только в том случае, если экземпляры 1+ соответствуют предложению WHERE/etc. Есть много вопросов о том, что SO спрашивает, имеет ли значение то, что в предложении SELECT, если вы хотите прочитать больше.
Ответ Джима, опечатанный в сторону, должен быть быстрее в MySQL, чем альтернатива, которую я предоставил. Чтобы узнать больше о том, почему, прочитайте эту статью: NOT IN vs NOT EXISTS vs LEFT JOIN/IS NULL в MySQL.