Форум программистов, компьютерный форум, киберфорум
Наши страницы
MySQL
Войти
Регистрация
Восстановить пароль
 
artem78
3 / 3 / 1
Регистрация: 20.12.2012
Сообщений: 326
#1

Запрос из двух таблиц

30.06.2016, 00:45. Просмотров 226. Ответов 7
Метки нет (Все метки)

Помогите составить такой запрос. Вывести order_id и offer у которых:
  1. active = 1
  2. и не было отправлений за последние 5 дней
Есть ещё нюанс: таблицы соединены по составному ключу (order_id + offer).

Код
Таблица заказов - "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 |
+----------+----------+

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.06.2016, 00:45
Ответы с готовыми решениями:

Запрос из двух таблиц
Есть 2 таблицы. CREATE TABLE IF NOT EXISTS `tbl1` ( `id` int(11) NOT NULL...

Запрос из двух таблиц
Здрасте. Помогите написать запрос, имеется две таблицы надо вывести Название...

Запрос из двух таблиц
Здравствуйте уважаемые форумчане! Очень сильно нужна ваша помощь. Написал...

Запрос из двух таблиц
Ребят, есть 3 таблицы: - user: {userid, остальная информация} - quest:...

Запрос из двух таблиц
Здравствуйте. Необходимо выбирать значения из двух таблиц. Укажите пожалуйста...

7
ns16
93 / 93 / 68
Регистрация: 26.03.2015
Сообщений: 248
30.06.2016, 09:17 #2
Попробуйте так:
SQL
1
2
3
4
5
SELECT o.order_id, o.offer
FROM orders AS o
JOIN sms AS s
ON o.order_id=s.order_id AND o.offer=s.offer
WHERE o.active=1 AND (TO_DAYS(NOW())-TO_DAYS(s.date))>5;
Правда записей {23, kopiya-2} и {27, kopiya-2} в результате не будет, потому что первой нет в таблице sms, а у второй active=0.
0
Meridian21
143 / 141 / 44
Регистрация: 16.12.2015
Сообщений: 590
Записей в блоге: 4
30.06.2016, 09:23 #3
artem78, немного странно получается, каким образом запись с order_id=23 попадает в выборку? Если речь идет, видимо, о простом join'е и в таблице sms нет строки с order_id=23?
0
cygapb-007
1306 / 938 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
30.06.2016, 12:25 #4
MySQL
1
2
3
4
5
6
select o.order_id, o.offer
from orders o
join sms s on s.order_id=o.order_id and s.offer=o.offer
where o.active=1
group by o.order_id, o.offer
having max(s.date)<now()-interval 5 day
Более точно с datetime возиться лениво
0
artem78
3 / 3 / 1
Регистрация: 20.12.2012
Сообщений: 326
30.06.2016, 15:08  [ТС] #5
Опечатался, конечно в результате сторока "27 kopiya-2" не нужна, там active=0. Должны остаться эти две строки:
Код
+----------+----------+
| order_id | offer    |
+----------+----------+
|        6 | kopiya   |
|       23 | kopiya-2 |
+----------+----------+
ns16, да "23 kopiya-2" отсутствует в таблице "sms", но нужно чтобы строки отсутствующие там тоже выбрало.

Добавлено через 6 минут
Уточно по-русски что в итоге нужно: выбрать "order_id + offer" у которых включена рассылка (active=1), но не было отправлений за посление 5 дней (date < now() - interval 5 day).
0
ns16
93 / 93 / 68
Регистрация: 26.03.2015
Сообщений: 248
30.06.2016, 15:37 #6
artem78, а разве запись {6, kopiya-3} не должна попасть в результат? Вроде тоже подходит под условия.
Как насчет такого варианта?
SQL
1
2
3
4
5
SELECT o.order_id, o.offer
FROM orders AS o
LEFT JOIN sms AS s
ON o.order_id=s.order_id AND o.offer=s.offer
WHERE o.active=1 AND (s.date<DATE_SUB(NOW(), INTERVAL "5" DAY) OR s.date IS NULL);
0
artem78
3 / 3 / 1
Регистрация: 20.12.2012
Сообщений: 326
30.06.2016, 16:01  [ТС] #7
Цитата Сообщение от ns16 Посмотреть сообщение
а разве запись {6, kopiya-3} не должна попасть в результат?
Не должна. Вы пропустили последнюю строку в "sms". Было две отправки, последняя менее 5 дней назад.

Ваш вариант близок к истине, но если в таблице "sms" содержится несколько записей для "order_id + offer" старше 5 дней, то строка в результате продублируется.
Код
+----------+----------+
| order_id | offer    |
+----------+----------+
|        6 | kopiya   |
|        6 | kopiya   |
|       23 | kopiya-2 |
Добавлено через 8 минут
Зато если добавить группировку, предложенную товарищем cygapb-007 получаем то что нужно.

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> SELECT o.order_id, o.offer
    -> 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    |
+----------+----------+
|        6 | kopiya   |
|       23 | kopiya-2 |
+----------+----------+
2 ROWS IN SET (0.00 sec)
0
artem78
3 / 3 / 1
Регистрация: 20.12.2012
Сообщений: 326
02.07.2016, 01:33  [ТС] #8
Вот только сейчас в своём последнем коде заметил один нюанс. Если мне потребуется добавить в вывод столбец из таблицы sms (например, status) для последней записи, то из за использования конструкции "max(date)" будет выбрано не то значение. Продемонстрирую своё сумбурное объяснение на примере:

MySQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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)
Для ключа "6 | kopiya-3" имеем 2 подходящие строки из таблицы "sms". У последней из них date=2016-06-23 и status=1. В результате запроса дата берётся правильно, но status=0!
0
02.07.2016, 01:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2016, 01:33

Запрос из двух таблиц
Подскажите, как пишется такого рода запрос. Например есть две таблицы. ...

Запрос данных из двух таблиц
Есть таблица number и есть таблица events Таблица events содержит события по...

Запрос insert из двух таблиц
Всем Добра! Такое дело... Подскажите как можно записать из двух таблиц в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru