使用group by或distinct的MySQL计数

使用group by或distinct的MySQL计数,mysql,Mysql,我有“对象”表: 我做了一些插入: insert into objects values (null, 'Cat', null), (null, 'Dog', null), (null, 'Mouse', 'AAA'), (null, 'Eagle', 'BBB'), (null, 'Elephant', null), (null, ' Bull', 'AAA'); 我需要计算行的总数。但是,组id为“AAA”的两行应合并为一行。 在上面的示例中,“count”应返回“5”。这是因为: “组

我有“对象”表:

我做了一些插入:

insert into objects values
(null, 'Cat', null),
(null, 'Dog', null),
(null, 'Mouse', 'AAA'),
(null, 'Eagle', 'BBB'),
(null, 'Elephant', null),
(null, ' Bull', 'AAA');
我需要计算行的总数。但是,组id为“AAA”的两行应合并为一行。 在上面的示例中,“count”应返回“5”。这是因为:

  • “组id”字段中有3行的值为空
  • 组id为“BBB”的行有1个“出现”
  • 组id为“AAA”的行有1个“出现”
使用group_id进行计数似乎不是解决方案,因为它返回3行,每行给出一个计数。我只需要行的总数

使用DISTINCT似乎也没有帮助。查询:

select count(distinct(group_id)) from objects;

返回值为“2”的行。

使用带条件的分组方式:

SELECT COUNT(*) FROM objects 
GROUP BY CASE
    WHEN group_id IS NULL THEN id
    ELSE group_id
    END

根据以下条件使用分组:

SELECT COUNT(*) FROM objects 
GROUP BY CASE
    WHEN group_id IS NULL THEN id
    ELSE group_id
    END
COUNT()仅对非_NULL值递增,因此

select count(distinct IFNULL(group_id,'-9nTfx')) from objects;
将从示例数据中返回3,对于“AAA”、“BBB”和NULL,每个数据为1

您要求的结果为5,因此我建议:

select
  count(distinct group_id) 
  + count(case when group_id IS NULL then 1 end) 
from objects;
  • 请注意,DISTINCT不是一个函数,所以当您编写 DISTINCT(group_id)这些括号被忽略。这也是 顺便说一句,“selectdistinct(somecolumn)”也是如此
@被用过的已经解释得很好了。我刚刚做了这个演示

COUNT()仅对非空值递增,因此

select count(distinct IFNULL(group_id,'-9nTfx')) from objects;
将从示例数据中返回3,对于“AAA”、“BBB”和NULL,每个数据为1

您要求的结果为5,因此我建议:

select
  count(distinct group_id) 
  + count(case when group_id IS NULL then 1 end) 
from objects;
  • 请注意,DISTINCT不是一个函数,所以当您编写 DISTINCT(group_id)这些括号被忽略。这也是 顺便说一句,“selectdistinct(somecolumn)”也是如此
@被用过的已经解释得很好了。我刚刚做了这个演示


第二个答案作为测试结果存在,以供考虑

MySQL 5.6架构设置

SELECT COUNT(*) FROM objects 
GROUP BY CASE
    WHEN group_id IS NULL THEN id
    ELSE group_id
    END
| COUNT(*) |
|----------|
|        1 |
|        1 |
|        1 |
|        2 |
|        1 |
查询2

SELECT COUNT(*) FROM objects 
GROUP BY CASE
    WHEN group_id IS NULL THEN id
    ELSE group_id
    END
| COUNT(*) |
|----------|
|        1 |
|        1 |
|        1 |
|        2 |
|        1 |

SELECT COUNT(*) FROM objects 
GROUP BY CASE
    WHEN group_id IS NULL THEN id
    ELSE group_id
    END
| COUNT(*) |
|----------|
|        1 |
|        1 |
|        1 |
|        2 |
|        1 |

第二个答案作为测试结果存在,以供考虑

MySQL 5.6架构设置

SELECT COUNT(*) FROM objects 
GROUP BY CASE
    WHEN group_id IS NULL THEN id
    ELSE group_id
    END
| COUNT(*) |
|----------|
|        1 |
|        1 |
|        1 |
|        2 |
|        1 |
查询2

SELECT COUNT(*) FROM objects 
GROUP BY CASE
    WHEN group_id IS NULL THEN id
    ELSE group_id
    END
| COUNT(*) |
|----------|
|        1 |
|        1 |
|        1 |
|        2 |
|        1 |

SELECT COUNT(*) FROM objects 
GROUP BY CASE
    WHEN group_id IS NULL THEN id
    ELSE group_id
    END
| COUNT(*) |
|----------|
|        1 |
|        1 |
|        1 |
|        2 |
|        1 |

id如何可以为空?这不应该null@bluto这是一个自动递增的整数,id怎么可以为空?这不应该null@bluto这是一个自动递增的整数,但不会返回5。您测试过吗?它与请求的结果根本不匹配-
我只需要行的总数。
在上面的示例中,“count”应该返回“5”请您解释为什么这是公认的答案?但这不会返回5您测试过吗?它与请求的结果根本不匹配-
我只需要行的总数。
在上面的示例中,“count”应该返回“5”