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

#mysql #sql #between #self-join

#mysql #sql #между #самостоятельное присоединение

Вопрос:

Учитывая таблицу tbl_orders , содержащую сведения о заказе за многие месяцы, каков наиболее эффективный SQL-запрос для получения списка идентификаторов пользователей userID , которые появляются в определенный период BETWEEN 2019-01-01 AND 2019-01-31 , но не появляются в другой период BETWEEN 2019-02-01 AND 2019-02-28 .

Столбец даты является orderDate

Я попытался присоединиться к себе, но это ничего не дает

 SELECT DISTINCT a.userID FROM tbl_orders a,  tbl_orders b WHERE a.orderDate BETWEEN 2019-01-01 AND 2021-01-31  AND b.orderDate  NOT BETWEEN 2019-02-01 AND 2019-02-28;  

Комментарии:

1. Прежде всего, вы должны указать литералы дат.

2. Когда вы не заключаете даты в кавычки , MySQL вы выполняете арифметические операции, поэтому 2019-01-01 равно 2017 и 2021-01-31 равно 1989 . Итак, вы делаете WHERE a.orderDate BETWEEN 2017 AND 1989

3. @ErgestBasha Большое спасибо. Проблема заключалась в цитате

Ответ №1:

Вы можете использовать НЕ СУЩЕСТВУЕТ

Ваши даты неверны, в них должна быть одна цитата

 SELECT DISTINCT a.userID FROM tbl_orders a  WHERE a.orderDate BETWEEN '2019-01-01' AND '2021-01-31'  AND NOT EXISTS(SELECT 1 FROM tbl_orders WHERE orderDate  BETWEEN '2019-02-01' AND '2019-02-28');  

Ответ №2:

Возможно, этот:

 SELECT userID FROM tbl_orders WHERE orderDate BETWEEN '2019-01-01' AND '2019-02-28' GROUP BY userID HAVING MAX(orderDate) lt;= '2019-01-31'