Запрос из двух таблиц - MySQL (220101)

Узнай цену своей работы

Формулировка задачи:

Помогите составить такой запрос. Вывести order_id и offer у которых:
  1. active = 1
  2. и не было отправлений за последние 5 дней
Есть ещё нюанс: таблицы соединены по составному ключу (order_id + offer).
Листинг программы
  1. Таблица заказов - "orders":
  2. +----------+----------+--------+----------+
  3. | order_id | offer | active | timezone |
  4. +----------+----------+--------+----------+
  5. | 6 | kopiya | 1 | 0 |
  6. | 6 | kopiya-3 | 1 | 0 |
  7. | 10 | kopiya | 1 | 180 |
  8. | 23 | kopiya-2 | 1 | 0 |
  9. | 27 | kopiya-2 | 0 | 0 |
  10. +----------+----------+--------+----------+
  11.  
  12. Таблица отправленных уведомлений - "sms":
  13. +----------+----------+----------+------+--------+---------------------+
  14. | key_ | order_id | offer | type | status | date |
  15. +----------+----------+----------+------+--------+---------------------+
  16. | 123 | 6 | kopiya | text | 1 | 2016-06-20 00:00:00 |
  17. | 984140 | 6 | kopiya-3 | text | 1 | 2016-06-21 00:00:00 |
  18. | 555 | 10 | kopiya | text | 1 | 2016-06-27 00:00:00 |
  19. | 8787897 | 27 | kopiya-2 | text | 1 | 2016-06-21 00:00:00 |
  20. | 5245844 | 27 | kopiya-2 | text | 1 | 2016-06-14 00:00:00 |
  21. | 78412544 | 6 | kopiya-3 | text | 1 | 2016-06-29 00:00:00 |
  22. +----------+----------+----------+------+--------+---------------------+
  23.  
  24. После выполнения запроса должно получится это:
  25. +----------+----------+
  26. | order_id | offer |
  27. +----------+----------+
  28. | 6 | kopiya |
  29. | 23 | kopiya-2 |
  30. | 27 | kopiya-2 |
  31. +----------+----------+

Решение задачи: «Запрос из двух таблиц»

textual
Листинг программы
  1. mysql> select * from orders;
  2. +----------+----------+--------+----------+
  3. | order_id | offer    | active | timezone |
  4. +----------+----------+--------+----------+
  5. |        6 | kopiya   |      1 |        0 |
  6. |        6 | kopiya-3 |      1 |        0 |
  7. |       10 | kopiya   |      1 |      180 |
  8. |       23 | kopiya-2 |      1 |        0 |
  9. |       27 | kopiya-2 |      0 |        0 |
  10. +----------+----------+--------+----------+
  11. 5 rows in set (0.00 sec)
  12.  
  13. mysql> select * from sms;
  14. +---------+----------+----------+------+--------+---------------------+
  15. | key_    | order_id | offer    | type | status | date                |
  16. +---------+----------+----------+------+--------+---------------------+
  17. | 1       |        6 | kopiya   | text |      1 | 2016-06-20 00:00:00 |
  18. | 2       |        6 | kopiya-3 | text |      0 | 2016-06-21 00:00:00 |
  19. | 3       |       10 | kopiya   | text |      1 | 2016-06-27 00:00:00 |
  20. | 4       |       27 | kopiya-2 | text |      1 | 2016-06-21 00:00:00 |
  21. | 5       |       27 | kopiya-2 | text |      1 | 2016-06-14 00:00:00 |
  22. | 6       |        6 | kopiya-3 | text |      1 | 2016-06-23 00:00:00 |
  23. | 7878    |        6 | kopiya-4 | text |      1 | 2016-06-01 00:00:00 |
  24. | 8781744 |        6 | kopiya-4 | text |      1 | 2016-06-30 00:00:00 |
  25. | 878744  |        6 | kopiya-4 | text |      1 | 2016-06-10 00:00:00 |
  26. +---------+----------+----------+------+--------+---------------------+
  27. 9 rows in set (0.00 sec)
  28.  
  29. mysql> SELECT o.order_id, o.offer, max(date) as last_date, status
  30.     -> FROM orders AS o
  31.     -> LEFT JOIN sms AS s
  32.     -> ON o.order_id=s.order_id AND o.offer=s.offer
  33.     -> WHERE `active` = 1
  34.     -> GROUP BY o.order_id, o.offer
  35.     -> HAVING
  36.     -> MAX(DATE)<now()-INTERVAL 5 DAY
  37.     -> OR MAX(DATE) IS NULL;
  38. +----------+----------+---------------------+--------+
  39. | order_id | offer    | last_date           | status |
  40. +----------+----------+---------------------+--------+
  41. |        6 | kopiya   | 2016-06-20 00:00:00 |      1 |
  42. |        6 | kopiya-3 | 2016-06-23 00:00:00 |      0 |
  43. |       10 | kopiya   | 2016-06-27 00:00:00 |      1 |
  44. |       23 | kopiya-2 | NULL                |   NULL |
  45. +----------+----------+---------------------+--------+
  46. 4 rows in set (0.00 sec)

Объяснение кода листинга программы

  1. Запрос SELECT * FROM orders; выводит все строки из таблицы orders. Результат запроса содержит столбцы order_id, offer, active и timezone.
  2. Запрос SELECT * FROM sms; выводит все строки из таблицы sms. Результат запроса содержит столбцы key_, order_id, offer, type, status, date.
  3. Запрос 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 WHEREactive= 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. Фильтрует результаты по условию WHEREactive= 1. Группирует результаты по столбцам o.order_id и o.offer. Применяет условие HAVING для фильтрации результатов:
    • MAX(DATE)<now()-INTERVAL 5 DAY - выбирает только те строки, где дата в столбце date меньше текущей даты минус 5 дней.
    • OR MAX(DATE) IS NULL - выбирает только те строки, где дата в столбце date равна NULL.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.75 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут