2009-11-17 2 views
0

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

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

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

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

 
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

Извините, я сейчас редактировал его. Я набрал «пользователей» вместо «служащих» – pedalpete

ответ

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

Спасибо Джим, я предположил, что вы имели в виду «НЕ В», но в стороне от этого, у меня создается впечатление, что IN неэффективен, когда попадает в более крупные запросы. – pedalpete

+0

Да, это так. Это должно быть достаточно эффективным способом фильтрации ваших результатов. –

1

Проблема ваша NOT EXISTS не correllated, и вы не сможете сделать с этим без использования псевдонимов таблиц:

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 in MySQL.

Смежные вопросы