Несколько агрегатных функций в запросе SQL - PullRequest
0 голосов
/ 03 марта 2019

Для этого примера я получил 3 простые таблицы (Страница, Подпрограммы и Подписчики):

My three tables

Для каждой страницы мне нужно знать, сколько подпрограмми последователи у него есть.Мой результат должен выглядеть следующим образом:

Result

Я пытался использовать функцию COUNT в сочетании с GROUP BY, как это:

SELECT p.ID, COUNT(s.UID) AS SubCount, COUNT(f.UID) AS FollowCount 
FROM page p, subs s, followers f 
WHERE p.ID = s.ID AND p.ID = f.ID AND s.ID = f.ID 
GROUP BY p.ID

Очевидно, что этот оператор возвращает неправильный результат.

Моя другая попытка состояла в том, чтобы использовать два разных оператора SELECT, а затем объединить два подрезультата в одну таблицу.

SELECT p.ID, COUNT(s.UID) AS SubCount FROM page p, subs s WHERE p.ID = s.ID GROUP BY p.ID

и

SELECT p.ID, COUNT(f.UID) AS FollowCount FROM page p, follow f WHERE p.ID = f.ID GROUP BY p.ID

Я чувствую, что должен быть более простой / короткий способ сделать это, но я слишком неопытен, чтобы найти его.

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Скалярный подзапрос должен работать в этом случае.

SELECT p.id,
       (SELECT Count(s_uid)
        FROM   subs s1
        WHERE  s1.s_id = p.id) AS cnt_subs,
       (SELECT Count(f_uid)
        FROM   followers f1
        WHERE  f1.f_id = p.id) AS cnt_fol
FROM   page p
GROUP  BY p.id; 
0 голосов
/ 03 марта 2019

Никогда не используйте запятые в предложении FROM. Всегда используйте правильный, явный, стандартный JOIN синтаксис.

Далее, узнайте, что делает COUNT().Он подсчитывает количество ненулевых значений.Итак, ваши выражения будут возвращать одно и то же значение - потому что f.UID и s.UID никогда не равны NULL (из-за условий JOIN).

Проблема заключается в том, что различные измеренияумножая суммы.Простым решением является использование COUNT(DISTINCT):

SELECT p.ID, COUNT(DISTINCT s.UID) AS SubCount, COUNT(DISTINCT f.UID) AS FollowCount 
FROM page p JOIN
     subs s
     ON p.ID = s.ID JOIN
     followers f 
     ON s.ID = f.ID 
GROUP BY p.ID;

Внутренние объединения эквивалентны исходному запросу.Вы, вероятно, хотите left join с, чтобы вы могли получить отсчет ноль:

SELECT p.ID, COUNT(DISTINCT s.UID) AS SubCount, COUNT(DISTINCT f.UID) AS FollowCount 
FROM page p LEFT JOIN
     subs s
     ON p.ID = s.ID LEFT JOIN
     followers f 
     ON p.ID = f.ID 
GROUP BY p.ID;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...