代码之家  ›  专栏  ›  技术社区  ›  ken

对与MySQL中的多个条件匹配的行进行计数

  •  0
  • ken  · 技术社区  · 16 年前

    请帮助我找出一个将转换以下数据的查询…

    |id |status_a |status_b |
    |+++++++++++++++++++++++|
    |  1|active   |inactive |
    

    …进入这个。

    |status_group      |count|
    |++++++++++++++++++++++++|
    |status_a.active   |    1|
    |status_b.inactive |    1|
    

    编辑:如果可以进行一次单程查询,那就更好了。另外,带有联合的查询是否只通过一次?

    3 回复  |  直到 14 年前
        1
  •  3
  •   LukáÅ¡ Lalinský    16 年前

    如果状态只能是 active inactive 我建议采用不同的方法:

    SELECT
        sum(if(status_a='active',1,0)) AS status_a_active,
        sum(if(status_a='inactive',1,0)) AS status_a_inactive,
        sum(if(status_b='active',1,0)) AS status_b_active,
        sum(if(status_b='inactive',1,0)) AS status_b_inactive
    FROM table
    

    否则,您需要使用 UNION 方法,但我会做得有点不同。首先,你可以使用 UNION ALL ,因为您不需要删除结果中的重复项。我也会用 GROUP BY 只有一次这样:

    SELECT status_group, count(id)
    FROM (
        SELECT CONCAT('status_a.', status_a) AS status_group, id FROM table
        UNION ALL
        SELECT CONCAT('status_b.', status_b) AS status_group, id FROM table
    ) a
    GROUP BY status_group
    
        2
  •  2
  •   hw.    16 年前

    我有一个使用工会的解决方案。如图所示:

    SELECT 'status_a.active' AS status_group, COUNT(*) AS count FROM `test` WHERE status_a = 'active'
    UNION
    SELECT 'status_a.inactive' AS status_group, COUNT(*) AS count FROM `test` WHERE status_a = 'inactive'
    UNION
    SELECT 'status_b.active' AS status_group, COUNT(*) AS count FROM `test` WHERE status_b = 'active'
    UNION
    SELECT 'status_b.inactive' AS status_group, COUNT(*) AS count FROM `test` WHERE status_b = 'inactive'
    

    基本上,它查询每个条件的状态“A”或状态“B”是否处于活动状态。我们得到了四个这样的查询,我们将联合应用于所有查询。

        3
  •  1
  •   ken    16 年前

    我想,我必须在不久前移动我的评论,这也是一个比硬件更短的解决方案。

    SELECT CONCAT('status_a.', status_a) AS stat, COUNT(id) FROM base GROUP BY stat 
    UNION
    SELECT CONCAT('status_b.', status_b) AS stat, COUNT(id) FROM base GROUP BY stat