MySQL COUNT与group by或distinct

时间:2015-10-13 07:17:25

标签: mysql

我有桌子"对象":

id (int)
name (varchar)
group_id (varchar) default null

我做了一些插页:

insert into objects values
(null, 'Cat', null),
(null, 'Dog', null),
(null, 'Mouse', 'AAA'),
(null, 'Eagle', 'BBB'),
(null, 'Elephant', null),
(null, ' Bull', 'AAA');

我需要计算总行数。但是,group_id为" AAA"的两行。应合并为一行。 在上面的示例中" count"应该返回" 5"。这是因为:

  • 字段中有3行具有NULL值" group_id"
  • 有1"出现" with group_id" BBB"
  • 的行数
  • 有1"出现" with group_id" AAA"
  • 的行数

使用group_id进行计数似乎不是解决方案,因为它返回3行,并且对于每行它给出计数。我只需要总行数。

使用DISTINCT似乎也无济于事。查询:

select count(distinct(group_id)) from objects;

返回值为" 2"

的行

3 个答案:

答案 0 :(得分:2)

USE Group by条件:

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

答案 1 :(得分:2)

COUNT()仅增加NON_NULL值,所以

select count(distinct IFNULL(group_id,'-9nTfx')) from objects;

将从您的样本数据返回3,每个为“AAA”'BBB'并且为NULL。

你要求的结果为5,所以我建议:

select
  count(distinct group_id) 
  + count(case when group_id IS NULL then 1 end) 
from objects;
  • 请注意DISTINCT不是函数,所以当你写的时候 DISTINCT(group_id)只是忽略了这些括号。这也是 顺便说一下,“选择不同的(某些列)”是真的。

@used_by_already解释得很好。我刚刚完成了这个演示

SEE WORKING DEMO IN ACTION

答案 2 :(得分:0)

第二个答案作为考试的测试结果存在。

This SQL Fiddle

MySQL 5.6架构设置

查询2

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

<强> Results

| COUNT(*) |
|----------|
|        1 |
|        1 |
|        1 |
|        2 |
|        1 |