【问题标题】:Mysql count rows and rows with nullMysql计算行数和空行数
【发布时间】:2018-08-08 14:25:13
【问题描述】:

大家好, 我有一张这样的桌子:

+----+------+
| id | grade| 
+----+------+
|  1 |    1 |
|  2 |    1 |
|  3 |    2 |
|  4 | NULL |
|  5 | NULL |
|  6 | NULL |
+----+------+

在哪里

1 坏

2 好

3 非常好

我试图得到类似的结果:

+--------------+------+
| grade        | count| 
+--------------+------+
| "Bad"        |    2 |
| "Good"       |    1 |
| "Very Good"  |    0 |
| "Not Ranked" |    3 |
+--------------+------+

我正在尝试计数但没有成功

【问题讨论】:

    标签: mysql sql select count null


    【解决方案1】:

    您可以使用CASE 更改grade 的值,而不是您想要的字符串值,

    SELECT  CASE WHEN grade = 1 THEN 'Bad'
                WHEN grade = 2 THEN 'Good'
                WHEN grade = 3 THEN 'Very Good'
                ELSE 'Not Ranked'
            END as grade,
            COUNT(IFNULL(grade, 0)) as `count`
    FROM    TableName
    GROUP   BY CASE WHEN grade = 1 THEN 'Bad'
                WHEN grade = 2 THEN 'Good'
                WHEN grade = 3 THEN 'Very Good'
                ELSE 'Not Ranked'
            END
    

    由于您想显示所有值,因此您需要创建一个返回所有值的子查询并使用LEFT JOIN 连接到您的表。

    SELECT  a.grade,
            COUNT(b.id)
    FROM    
            (
                SELECT 1 id, 'Bad' grade UNION ALL
                SELECT 2 id, 'Good' grade UNION ALL
                SELECT 3 id, 'Very Good' grade UNION ALL
                SELECT 999 id, 'Not Ranked' grade 
            ) a
            LEFT JOIN TableName b ON a.id = IFNULL(b.grade, 999)
    GROUP   BY a.grade
    

    这是Demo

    【讨论】:

    • 这太棒了!但是我仍然没有得到非常好的零分,因为我没有在表中,但它作为一个等级存在,顺便说一句,我有一个名为“等级”的表格,其中包含所有等级的寄存器。跨度>
    • 这很有魅力,非常感谢@John Woo
    • 如果需要按特定顺序排列,也可以添加order by a.id
    【解决方案2】:

    如果您可以使用数字,并稍后将它们与字符串匹配,那么这可能是一个解决方案:

    SELECT grade, count(*) as id FROM tbl GROUP BY grade
    

    source

    【讨论】:

    • 来自@John Woo 我没有“非常好”的信息,因为它不在表格中
    • 您可以通过在表格中默认设置每个等级之一并从输出中每个等级的数量中减去一个来解决此问题。
    • 这并不能解决问题,因为我可以不能有成绩,是可选的,我不能从null中减去1跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 2012-05-01
    • 2012-11-03
    相关资源
    最近更新 更多