【问题标题】:MySQL COUNT with group by or distinctMySQL COUNT 与 group by 或 distinct
【发布时间】:2015-10-13 07:17:24
【问题描述】:

我有表“对象”:

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”。这是因为:

  • 字段“group_id”的值为 NULL 的 3 行
  • group_id 为“BBB”的行有 1 次“出现”
  • group_id 为“AAA”的行有 1 次“出现”

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

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

select count(distinct(group_id)) from objects;

返回值为“2”的行

【问题讨论】:

  • id怎么可以为空?不应该为空
  • @bluto 这是一个自动递增的整数

标签: mysql


【解决方案1】:

使用条件分组:

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

【讨论】:

  • 但这不会返回 5
  • 你测试过这个吗?它根本不匹配请求的结果 - I only need the total count of rows.In the example above "count" should return "5".
  • 您能解释一下为什么这是公认的答案吗?
【解决方案2】:

COUNT() 只增加 NON_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) 这些括号被简单地忽略。这也是 顺便说一句,“select distinct(somecolumn)”是正确的。

@used_by_already 解释得很好。我刚刚做了这个演示给打击

SEE WORKING DEMO IN ACTION

【讨论】:

    【解决方案3】:

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

    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 |
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-14
      • 1970-01-01
      • 1970-01-01
      • 2021-02-09
      • 1970-01-01
      • 2019-04-20
      • 2020-10-30
      • 2014-11-07
      相关资源
      最近更新 更多