Запрос из двух таблиц - MySQL (220101)
Формулировка задачи:
Помогите составить такой запрос. Вывести order_id и offer у которых:
- active = 1
- и не было отправлений за последние 5 дней
Листинг программы
- Таблица заказов - "orders":
- +----------+----------+--------+----------+
- | order_id | offer | active | timezone |
- +----------+----------+--------+----------+
- | 6 | kopiya | 1 | 0 |
- | 6 | kopiya-3 | 1 | 0 |
- | 10 | kopiya | 1 | 180 |
- | 23 | kopiya-2 | 1 | 0 |
- | 27 | kopiya-2 | 0 | 0 |
- +----------+----------+--------+----------+
- Таблица отправленных уведомлений - "sms":
- +----------+----------+----------+------+--------+---------------------+
- | key_ | order_id | offer | type | status | date |
- +----------+----------+----------+------+--------+---------------------+
- | 123 | 6 | kopiya | text | 1 | 2016-06-20 00:00:00 |
- | 984140 | 6 | kopiya-3 | text | 1 | 2016-06-21 00:00:00 |
- | 555 | 10 | kopiya | text | 1 | 2016-06-27 00:00:00 |
- | 8787897 | 27 | kopiya-2 | text | 1 | 2016-06-21 00:00:00 |
- | 5245844 | 27 | kopiya-2 | text | 1 | 2016-06-14 00:00:00 |
- | 78412544 | 6 | kopiya-3 | text | 1 | 2016-06-29 00:00:00 |
- +----------+----------+----------+------+--------+---------------------+
- После выполнения запроса должно получится это:
- +----------+----------+
- | order_id | offer |
- +----------+----------+
- | 6 | kopiya |
- | 23 | kopiya-2 |
- | 27 | kopiya-2 |
- +----------+----------+
Решение задачи: «Запрос из двух таблиц»
textual
Листинг программы
- mysql> select * from orders;
- +----------+----------+--------+----------+
- | order_id | offer | active | timezone |
- +----------+----------+--------+----------+
- | 6 | kopiya | 1 | 0 |
- | 6 | kopiya-3 | 1 | 0 |
- | 10 | kopiya | 1 | 180 |
- | 23 | kopiya-2 | 1 | 0 |
- | 27 | kopiya-2 | 0 | 0 |
- +----------+----------+--------+----------+
- 5 rows in set (0.00 sec)
- mysql> select * from sms;
- +---------+----------+----------+------+--------+---------------------+
- | key_ | order_id | offer | type | status | date |
- +---------+----------+----------+------+--------+---------------------+
- | 1 | 6 | kopiya | text | 1 | 2016-06-20 00:00:00 |
- | 2 | 6 | kopiya-3 | text | 0 | 2016-06-21 00:00:00 |
- | 3 | 10 | kopiya | text | 1 | 2016-06-27 00:00:00 |
- | 4 | 27 | kopiya-2 | text | 1 | 2016-06-21 00:00:00 |
- | 5 | 27 | kopiya-2 | text | 1 | 2016-06-14 00:00:00 |
- | 6 | 6 | kopiya-3 | text | 1 | 2016-06-23 00:00:00 |
- | 7878 | 6 | kopiya-4 | text | 1 | 2016-06-01 00:00:00 |
- | 8781744 | 6 | kopiya-4 | text | 1 | 2016-06-30 00:00:00 |
- | 878744 | 6 | kopiya-4 | text | 1 | 2016-06-10 00:00:00 |
- +---------+----------+----------+------+--------+---------------------+
- 9 rows in set (0.00 sec)
- mysql> SELECT o.order_id, o.offer, max(date) as last_date, status
- -> FROM orders AS o
- -> LEFT JOIN sms AS s
- -> ON o.order_id=s.order_id AND o.offer=s.offer
- -> WHERE `active` = 1
- -> GROUP BY o.order_id, o.offer
- -> HAVING
- -> MAX(DATE)<now()-INTERVAL 5 DAY
- -> OR MAX(DATE) IS NULL;
- +----------+----------+---------------------+--------+
- | order_id | offer | last_date | status |
- +----------+----------+---------------------+--------+
- | 6 | kopiya | 2016-06-20 00:00:00 | 1 |
- | 6 | kopiya-3 | 2016-06-23 00:00:00 | 0 |
- | 10 | kopiya | 2016-06-27 00:00:00 | 1 |
- | 23 | kopiya-2 | NULL | NULL |
- +----------+----------+---------------------+--------+
- 4 rows in set (0.00 sec)
Объяснение кода листинга программы
- Запрос
SELECT * FROM orders;
выводит все строки из таблицыorders
. Результат запроса содержит столбцыorder_id
,offer
,active
иtimezone
. - Запрос
SELECT * FROM sms;
выводит все строки из таблицыsms
. Результат запроса содержит столбцыkey_
,order_id
,offer
,type
,status
,date
. - Запрос
SELECT o.order_id, o.offer, max(date) as last_date, s.status FROM orders AS o LEFT JOIN sms AS s ON o.order_id=s.order_id AND o.offer=s.offer WHERE
active= 1 GROUP BY o.order_id, o.offer HAVING MAX(DATE)<now()-INTERVAL 5 DAY OR MAX(DATE) IS NULL;
объединяет таблицыorders
иsms
по условиямo.order_id=s.order_id AND o.offer=s.offer
. Выбирает столбцыorder_id
,offer
,last_date
иstatus
. Фильтрует результаты по условиюWHERE
active= 1
. Группирует результаты по столбцамo.order_id
иo.offer
. Применяет условиеHAVING
для фильтрации результатов:MAX(DATE)<now()-INTERVAL 5 DAY
- выбирает только те строки, где дата в столбцеdate
меньше текущей даты минус 5 дней.OR MAX(DATE) IS NULL
- выбирает только те строки, где дата в столбцеdate
равнаNULL
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д