powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / пытаюсь сделать GROUP BY в UNION но явно пишу неправильно, поправьте пожалуйста
13 сообщений из 13, страница 1 из 1
пытаюсь сделать GROUP BY в UNION но явно пишу неправильно, поправьте пожалуйста
    #39313489
Nick-name
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У всех использованных в запросе таблиц структура одинаковая
Код: sql
1.
2.
3.
SELECT DATE(dt) as date, unsubtype, count(*) as count FROM (SELECT DATE(dt) as date, unsubtype, count(*) as count FROM mailer_unsub_monthly WHERE dt >= '2016-09-01' AND dt <= '2016-09-22'  
        UNION SELECT DATE(dt) as date, unsubtype, count(*) as count FROM mailer_unsub_info WHERE dt >= '2016-09-01' AND dt <= '2016-09-22' 
        UNION SELECT DATE(dt) as date, unsubtype, count(*) as count FROM mailer_unsub_offer WHERE dt >= '2016-09-01' AND dt <= '2016-09-22') GROUP BY DATE(dt),unsubtype
...
Рейтинг: 0 / 0
пытаюсь сделать GROUP BY в UNION но явно пишу неправильно, поправьте пожалуйста
    #39313497
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nick-name,

Если правильно понял идею, то как-то так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT mydate, unsubtype, sum(cnt) as sum_count 
FROM (
SELECT DATE(dt) as mydate, unsubtype, count(*) as cnt FROM mailer_unsub_monthly WHERE dt >= '2016-09-01' AND dt <= '2016-09-22'  
UNION ALL
SELECT DATE(dt), unsubtype, count(*) FROM mailer_unsub_info WHERE dt >= '2016-09-01' AND dt <= '2016-09-22' 
UNION ALL
SELECT DATE(dt), unsubtype, count(*) FROM mailer_unsub_offer WHERE dt >= '2016-09-01' AND dt <= '2016-09-22'
) t
GROUP BY mydate, unsubtype

1) Не стоит использовать имена, которые используются в синтаксисе, даже если формально это доупстимо, т.к. сильно снижает читабельность запроса.
2) Если я правильно понимаю, что поле dt содержит дату со временем, то, вероятно, все условия надо исправить на строгое неравенство dt < '2016-09-22', чтобы полночь следующего дня случайно не влетела в выборку.
...
Рейтинг: 0 / 0
пытаюсь сделать GROUP BY в UNION но явно пишу неправильно, поправьте пожалуйста
    #39313506
Nick-name
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,
Да ошибок уже не вываливает. Но результат не такой как нужно. В кратце поясню что должен сделать этот запрос.
Есть три таблицы в которых фиксируются отписки от рассылок поле unsubtype содержит номер причины отписки
задача выудить всех отписавшихся а формат ответа примерно такой
dt unsubtype count
2016-09-20 1 25
2016-09-20 3 5
2016-09-20 4 10
2016-09-21 1 10
2016-09-21 2 15
2016-09-21 3 3
2016-09-21 4 30
...
Рейтинг: 0 / 0
пытаюсь сделать GROUP BY в UNION но явно пишу неправильно, поправьте пожалуйста
    #39313509
Nick-name
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nick-name,

структура таблиц одинаковая
...
Рейтинг: 0 / 0
пытаюсь сделать GROUP BY в UNION но явно пишу неправильно, поправьте пожалуйста
    #39313510
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nick-nameНо результат не такой как нужно.Показывайте более конкретно.
Пока я не вижу расхождений запроса с желаемым результатом.
...
Рейтинг: 0 / 0
пытаюсь сделать GROUP BY в UNION но явно пишу неправильно, поправьте пожалуйста
    #39313515
Nick-name
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

Смотрите запрос по одной из таблиц
Код: sql
1.
SELECT DATE(dt) as date, unsubtype, count(*) as count FROM  mailer_unsub_offer WHERE dt > '2016-09-01' AND dt < '2016-09-22'  GROUP BY DATE(dt),unsubtype;


даёт результат в 89 строк
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
+------------+-----------+-------+
| date       | unsubtype | count |
+------------+-----------+-------+
| 2016-09-01 |         0 |   248 |
| 2016-09-01 |         1 |    31 |
| 2016-09-01 |         2 |     1 |
| 2016-09-01 |         3 |   296 |
| 2016-09-01 |         4 |   495 |
| 2016-09-02 |         0 |   240 |
| 2016-09-02 |         1 |    17 |
| 2016-09-02 |         3 |    13 |
| 2016-09-02 |         4 |   415 |
| 2016-09-03 |         0 |   168 |


| 2016-09-03 |         1 |    18 |
| 2016-09-03 |         3 |    11 |
и тд.


по остальным таблицам примерно такие же результаты
а union возвращает
Код: sql
1.
2.
3.
4.
5.
6.
+------------+-----------+-----------+
| mydate     | unsubtype | sum_count |
+------------+-----------+-----------+
| 2016-09-01 |         1 |     22736 |
| 2016-09-01 |         4 |     25295 |
+------------+-----------+-----------+


ну или если sum заменить на count то получается
Код: sql
1.
2.
3.
4.
5.
6.
+------------+-----------+-----------+
| mydate     | unsubtype | sum_count |
+------------+-----------+-----------+
| 2016-09-01 |         1 |         2 |
| 2016-09-01 |         4 |         1 |
+------------+-----------+-----------+


я не понимаю почему.
...
Рейтинг: 0 / 0
пытаюсь сделать GROUP BY в UNION но явно пишу неправильно, поправьте пожалуйста
    #39313521
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nick-nameа union возвращает
Код: sql
1.
2.
3.
4.
5.
6.
+------------+-----------+-----------+
| mydate     | unsubtype | sum_count |
+------------+-----------+-----------+
| 2016-09-01 |         1 |     22736 |
| 2016-09-01 |         4 |     25295 |
+------------+-----------+-----------+

Т.е. большая часть записей просто пропадает?
Что-то не верится, так не должно быть. Показывайте точный и полный запрос.
...
Рейтинг: 0 / 0
пытаюсь сделать GROUP BY в UNION но явно пишу неправильно, поправьте пожалуйста
    #39313537
Nick-name
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

ну запрос я Ваш скопировал, а вот почему отваливается большая часть строк в ответе, я и не могу понять.
смотрите по отдельности запросы выглядят так
Код: sql
1.
2.
3.
SELECT DATE(dt) as date, unsubtype, count(*) as count FROM  mailer_unsub_monthly WHERE dt > '2016-09-01' AND dt < '2016-09-22'  GROUP BY DATE(dt),unsubtype;
SELECT DATE(dt) as date, unsubtype, count(*) as count FROM  mailer_unsub_info WHERE dt > '2016-09-01' AND dt < '2016-09-22'  GROUP BY DATE(dt),unsubtype;
SELECT DATE(dt) as date, unsubtype, count(*) as count FROM  mailer_unsub_offer WHERE dt > '2016-09-01' AND dt < '2016-09-22'  GROUP BY DATE(dt),unsubtype; 


по отдельности все работают правильно
...
Рейтинг: 0 / 0
пытаюсь сделать GROUP BY в UNION но явно пишу неправильно, поправьте пожалуйста
    #39313555
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорей всего вы хотели сделать union all, а не union.
...
Рейтинг: 0 / 0
пытаюсь сделать GROUP BY в UNION но явно пишу неправильно, поправьте пожалуйста
    #39313557
Nick-name
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Melkij,

Очень может быть, я не особо селен в sql, очень посредственные знания
...
Рейтинг: 0 / 0
пытаюсь сделать GROUP BY в UNION но явно пишу неправильно, поправьте пожалуйста
    #39313562
Nick-name
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nick-name,

но как я понял miksoft как раз и предложил вариант с UNION ALL
...
Рейтинг: 0 / 0
пытаюсь сделать GROUP BY в UNION но явно пишу неправильно, поправьте пожалуйста
    #39313594
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nick-name, да, верно. Аа, там есть аггрегирующая функция и нет группировки. mysql только недавно начал на такое ругаться по-умолчанию.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT mydate, unsubtype, sum(cnt) as sum_count 
FROM (
SELECT DATE(dt) as mydate, unsubtype, count(*) as cnt FROM mailer_unsub_monthly WHERE dt >= '2016-09-01' AND dt <= '2016-09-22'  GROUP BY mydate, unsubtype
UNION ALL
SELECT DATE(dt) as mydate, unsubtype, count(*) FROM mailer_unsub_info WHERE dt >= '2016-09-01' AND dt <= '2016-09-22' GROUP BY mydate, unsubtype
UNION ALL
SELECT DATE(dt) as mydate, unsubtype, count(*) FROM mailer_unsub_offer WHERE dt >= '2016-09-01' AND dt <= '2016-09-22' GROUP BY mydate, unsubtype
) t
GROUP BY mydate, unsubtype



Либо, раз всё равно группировка по индексу не светит из-за вычисляемого поля:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT mydate, unsubtype, count(1) as sum_count 
FROM (
SELECT DATE(dt) as mydate, unsubtype FROM mailer_unsub_monthly WHERE dt >= '2016-09-01' AND dt <= '2016-09-22' 
UNION ALL
SELECT DATE(dt) as mydate, unsubtype FROM mailer_unsub_info WHERE dt >= '2016-09-01' AND dt <= '2016-09-22'
UNION ALL
SELECT DATE(dt) as mydate, unsubtype FROM mailer_unsub_offer WHERE dt >= '2016-09-01' AND dt <= '2016-09-22'
) t
GROUP BY mydate, unsubtype
...
Рейтинг: 0 / 0
пытаюсь сделать GROUP BY в UNION но явно пишу неправильно, поправьте пожалуйста
    #39313600
Nick-name
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Melkij,

Воо, 90 строк, вроде бы все нормально, спасибо большое всем
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / пытаюсь сделать GROUP BY в UNION но явно пишу неправильно, поправьте пожалуйста
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]