|
Получить две разные группировки в одном запросе
|
|||
---|---|---|---|
#18+
Таблица выглядит следующим образом id | id уведомления | id пользователя | прочитано Связь уведомления к пользователю - 1 ко многим. Прочитано - либо да, либо нет, технически целое число 0 или 1 (Это не моя поделка, критику не принимаю (: ) Задача: сделать выборку с группировкой по id уведомления по двум метрикам в виде: Id уведомления, количество пользователелей | количество прочитанных. Часовое гугление не дало плодов. Задачу решил костыльно следующим образом: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Костыль работает как надо, но всё же хочется знать, как такие задачи решаются. Для первой агрегации условие WHERE UF_NOTIFICATION IN {ids}, для второго WHERE UF_NOTIFICATION IN {ids} AND UF_FLAG_READ = 1 Научите уму-разуму ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2021, 03:54 |
|
Получить две разные группировки в одном запросе
|
|||
---|---|---|---|
#18+
Так же пытался копать в сторону JOIN этой же таблицы, JOIN вложенного запроса. Если есть какие-то качественные метрики запроса (это работает быстрее по такой то причине: ...), тоже хотелось бы знать. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2021, 03:57 |
|
Получить две разные группировки в одном запросе
|
|||
---|---|---|---|
#18+
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} . Если значений в списке больше десятка, сервер проигнорирует наличие индекса и устроит фуллскан, даже если селективность по условию высока. В этом случае формирование набора значений как набора строк (в СТЕ или временной таблице) может быть оправданным решением. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2021, 07:48 |
|
|
start [/forum/topic.php?fid=47&msg=40104604&tid=1827915]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
157ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
others: | 237ms |
total: | 494ms |
0 / 0 |