使用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个“出现”
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)”也是如此
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”你能解释一下为什么这是公认的答案吗?