COUNT(*) 在 GROUP BY 子句之前返回行数?

COUNT(*) returning number of rows before GROUP BY clause?

我有以下查询:

SELECT COUNT(*)
FROM mydb.table1 t1
JOIN mydb.table2 t2 ON t1.id = t2.t1_id
WHERE t1.user_id = 44 AND t1.date_deleted IS NULL
GROUP BY t2.system_id, CASE WHEN t2.system_id IS NULL THEN t2.id ELSE 0 END

它 returns COUNT(*) = 6,当它应该返回 1 因为这个用户的所有六行都具有相同的 t2.system_id (所以他们应该分组)。

如果我将查询更改为 select * 而不是 COUNT(*),它只会 returns 一行。如果我随后删除 GROUP BY 子句,将返回六行。

这让我觉得 COUNT(*) 在执行 GROUP BY 子句之前返回行数,但据我所知,这不是它应该的工作方式。

这种行为正常吗?

它returns 每组中的项目数。您有一个包含六个项目的组,因此它 returns 一行包含一个值为 6 的列。

试试这个:

select count(*) from (
  SELECT *
    FROM mydb.table1 t1
    JOIN mydb.table2 t2 ON t1.id = t2.t1_id
    WHERE t1.user_id = 44 
      AND t1.date_deleted IS NULL
    GROUP BY t2.system_id, 
      CASE WHEN t2.system_id IS NULL THEN t2.id ELSE 0 END
) q1

count 为您提供每组中的项目数(非空),所以是的,它确实按预期方式工作。这意味着如果您只想要组的总数,最简单的方法是将其包装在另一个查询中。