Mysql 在一个表中计算三个可能性

Mysql 在一个表中计算三个可能性,mysql,sql,Mysql,Sql,我有一个带有订阅服务器的表,它有两个字段,actived和suscribed。我需要得到总的订阅者数量,激活的数量和在同一咨询中订阅的数量。我曾尝试使用双左连接来实现这一点,但我需要按一个不是主键的字段分组,结果出现错误。我现在有这样的咨询: FROM (SELECT subscribers.mailing_list, subscribers.mailing_list AS suscriptores, s2.inactivos AS inactivos, s3.excluidos AS excl

我有一个带有订阅服务器的表,它有两个字段,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```


不需要3个查询,而是需要聚合函数中的
case表达式
,这称为“条件聚合”,例如


在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个国际标签null@DonProt肖恩。如何从这些中获取
NULL
?唯一的方法是如果订阅的
NULL
,这在其他方面似乎有问题。
SELECT mailing_list,
       SUM( NOT subscribed ) AS inactivos,
       SUM( subscribed ) AS excluidos,
       COUNT( * ) AS Total
FROM subscribers
GROUP BY mailing_list;