#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'