powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Получить две разные группировки в одном запросе
3 сообщений из 3, страница 1 из 1
Получить две разные группировки в одном запросе
    #40104603
greenisius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Таблица выглядит следующим образом

id | id уведомления | id пользователя | прочитано

Связь уведомления к пользователю - 1 ко многим. Прочитано - либо да, либо нет, технически целое число 0 или 1 (Это не моя поделка, критику не принимаю (: )

Задача: сделать выборку с группировкой по id уведомления по двум метрикам в виде:

Id уведомления, количество пользователелей | количество прочитанных.

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

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
         
            SELECT
                UF_NOTIFICATION AS id,
                COUNT(UF_NOTIFICATION) AS "count",
                SUM(UF_FLAG_READ) AS "read"
            FROM
                [bind]
            WHERE
                UF_NOTIFICATION IN {ids}
            GROUP BY
                UF_NOTIFICATION       



Костыль работает как надо, но всё же хочется знать, как такие задачи решаются. Для первой агрегации условие WHERE UF_NOTIFICATION IN {ids},
для второго WHERE UF_NOTIFICATION IN {ids} AND UF_FLAG_READ = 1

Научите уму-разуму
...
Рейтинг: 0 / 0
Получить две разные группировки в одном запросе
    #40104604
greenisius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так же пытался копать в сторону JOIN этой же таблицы, JOIN вложенного запроса.

Если есть какие-то качественные метрики запроса (это работает быстрее по такой то причине: ...), тоже хотелось бы знать.
...
Рейтинг: 0 / 0
Получить две разные группировки в одном запросе
    #40104619
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
greenisius
Получить две разные группировки в одном запросе

Где тут две группировки-то? для обоих показателей группировка одна и та же - по уведомлению. Вот условия отбора - да, разные. Потому и применяется заново изобретённое Вами условное агрегирование.

greenisius
Задачу решил костыльно следующим образом

Это не костыль, а правильное, в том числе идеологически, решение.

Есть только одно допущение - что UF_FLAG_READ содержит только значения 0 и 1. Если поле определено как UF_FLAG_READ TINYINT NOT NULL CHECK (UF_FLAG_READ IN (0,1)) , то решение правильное вообще со всех сторон, иначе вместо SUM(UF_FLAG_READ) AS "read" должно использоваться SUM(UF_FLAG_READ = 1) AS "read" (а в других СУБД - так и вообще SUM(CASE WHEN UF_FLAG_READ = 1 THEN 1 ELSE 0 END) AS "read" ).

Единственное сомнительное место, да и то с точки зрения производительности - это WHERE UF_NOTIFICATION IN {ids} . Если значений в списке больше десятка, сервер проигнорирует наличие индекса и устроит фуллскан, даже если селективность по условию высока. В этом случае формирование набора значений как набора строк (в СТЕ или временной таблице) может быть оправданным решением.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Получить две разные группировки в одном запросе
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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