получить доступный день с даты ранте

0

Я думаю, что я довольно близко отношусь к этому запросу, но, похоже, не могу его взломать, и я не уверен, есть ли у меня самый эффективный подход.

Я пытаюсь найти день, когда пользователь не забронирован из ряда дат, где они бронируются.

Подумайте о кадровом планировании. Мне нужно найти, кто будет работать во вторник, и работает в другие дни на этой неделе.

В настоящий момент мой запрос выглядит следующим образом

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 результатов.

  • 0
    Извините, я редактировал это сейчас. Я набрал «пользователи» вместо «сотрудники»
Теги:
not-exists

2 ответа

1
Лучший ответ

Возможно, вы захотите попробовать что-то большее:

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'
)
  • 0
    Благодаря Джиму, я предположил, что вы имели в виду «НЕ В», но помимо этого у меня сложилось впечатление, что ВН неэффективен при получении больших запросов.
  • 0
    Да это правильно. Это должен быть достаточно эффективный способ фильтрации ваших результатов.
1

Проблема в том, что ваш 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню