Если между двумя датами в объединенной таблице нет записей - PullRequest
4 голосов
/ 16 сентября 2011

Я пытаюсь выбрать все наши товары, которые вообще не продавались за последние 2 месяца.

Я пытаюсь использовать этот запрос, но он не работает должным образом:

SELECT SalesDescription FROM Items I
LEFT JOIN Orders_Items OI
ON OI.ItemID=I.ItemID

LEFT JOIN Orders O
 ON O.OrderID=OI.OrderID

WHERE OrderTime NOT BETWEEN date_sub(curdate(), interval 2 month)
AND date_sub(curdate(), interval 1 day)
Group By I.ItemID

По сути, я хочу получить все записи из таблицы Предметов (сгруппированные по идентификатору предмета), если и только если они не были заказаны в течение последних двух месяцев.

Когда ясделайте мое объединение выше, результирующая таблица выглядит примерно так:

Name        OrderID     OrderDate
Widget A     1          Last Year    
Widget B     2          Last Week
Widget C     3          Last Year
Widget C     4          Last Week

Мой результат должен возвращать только виджет A, поскольку он не был заказан за последние 2 месяца.Тот факт, что он был заказан более года назад, не имеет значения.

Виджет C не должен появляться, поскольку заказ, содержащий виджет C, был размещен в последние 2 месяца.

Проблема в том,записи, которые я хочу, не будут иметь диапазон дат, связанный с ними.Еще один способ выразить это:

Я хочу начать со всех элементов в таблице Предметов, а затем исключить те, к которым прикреплены заказы И хотя бы один из этих прикрепленных заказов был размещен в течение 2 месяцев.диапазон.

Как я могу получить это?

1 Ответ

3 голосов
/ 16 сентября 2011

Лично я думаю, что это самое ясное выражение вашего вопроса:

 SELECT SalesDescription FROM Items I
     WHERE NOT EXISTS (SELECT * FROM Orders O 
                       WHERE O.ItemID = I.ItemID AND O.OrderTime BETWEEN X AND Y)

(где X и Y - рассматриваемые даты).

Вы также можете написать это так:

 SELECT SalesDescription FROM Items 
     WHERE ItemID NOT IN 
           (SELECT ItemID FROM Orders O WHERE O.OrderTime BETWEEN X AND Y)

Любая версия должна быть «достаточно быстрой» для нескольких тысяч элементов для случайного использования.Если ваша таблица элементов намного больше или вам нужно выполнить этот запрос во время какой-либо онлайн-транзакции (в отличие от отчетов), есть альтернативные способы ее написания.Вы даже можете сделать это с помощью JOIN, но вам нужно присоединиться к заказам только один раз, а не дважды.

(Примечание. У вас есть два разных определения вопроса в вашем запросе. Во-первых, вы запрашиваете всепредметы, которые не были проданы в течение последних двух месяцев. Затем, в сводке, вы запрашиваете все товары , которые были проданы хотя бы один раз , но не в течение последних двух месяцев. Первая версия (на которую я ответил)будет включать предметы, которые никогда не продавались. Второй исключает их.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...