Подсчитайте три возможности в одной таблице - PullRequest
0 голосов
/ 09 января 2019

У меня есть таблица с подписчиками, которая имеет два поля, actived и suscribed. Мне нужно узнать общее количество подписчиков, количество активированных и количество подозреваемых в одной и той же консультации. Я попытался сделать это с двойным левым соединением, но мне нужно сгруппировать по полю, которое не является первичным ключом, и я получаю ошибку. Теперь у меня есть такая консультация:

FROM (SELECT subscribers.mailing_list, subscribers.mailing_list AS suscriptores, s2.inactivos AS inactivos, s3.excluidos AS excluidos
FROM subscribers
LEFT JOIN (SELECT id, mailing_list, COUNT(*) AS inactivos FROM subscribers WHERE subscribed = false GROUP BY id) s2 ON subscribers.id = s2.id
LEFT JOIN (SELECT id, mailing_list, COUNT(*) AS excluidos FROM subscribers WHERE excluded = true GROUP BY id) s3 ON subscribers.id = s3.id
) AS subs
GROUP BY subs.mailing_list```

Ответы [ 2 ]

0 голосов
/ 09 января 2019

В MySQL вы можете упростить эту логику до:

SELECT mailing_list,
       SUM( subscribed = FALSE ) AS inactivos,
       SUM( subscribed = TRUE ) AS excluidos,
       COUNT( * ) AS Total
FROM subscribers
GROUP BY mailing_list;

Если subscribed на самом деле boolean, вы можете еще больше упростить это до:

SELECT mailing_list,
       SUM( NOT subscribed ) AS inactivos,
       SUM( subscribed ) AS excluidos,
       COUNT( * ) AS Total
FROM subscribers
GROUP BY mailing_list;
0 голосов
/ 09 января 2019

Вместо 3 запросов вам нужно case expressions внутри агрегатной функции, это известно как «условные агрегаты», например

SELECT
        mailing_list
      , COUNT( CASE WHEN subscribed = FALSE THEN 1 END ) AS inactivos
      , COUNT( CASE WHEN subscribed = TRUE  THEN 1 END ) AS excluidos
      , COUNT( * ) AS Total
FROM subscribers
GROUP BY
        mailing_list
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...