COUNT(*)返回错误的数字

时间:2014-06-18 17:31:40

标签: mysql

似乎我没有得到它。请考虑此查询

SELECT COUNT(*) AS `numrows` 
FROM (`exp_channel_titles` ch) 
JOIN `exp_channel_data` cd ON `cd`.`entry_id`=`ch`.`entry_id` 
LEFT JOIN `exp_matrix_data` md ON `md`.`entry_id`=`ch`.`entry_id` and field_id = 14 
LEFT JOIN `exp_assessment_users` au ON `au`.`entry_id`=`ch`.`entry_id` 
WHERE ch.channel_id = 4 GROUP BY `ch`.`entry_id`

返回2

但如果我将其更改为

SELECT * 
FROM (`exp_channel_titles` ch) 
JOIN `exp_channel_data` cd ON `cd`.`entry_id`=`ch`.`entry_id` 
LEFT JOIN `exp_matrix_data` md ON `md`.`entry_id`=`ch`.`entry_id` and field_id = 14 
LEFT JOIN `exp_assessment_users` au ON `au`.`entry_id`=`ch`.`entry_id` 
WHERE ch.channel_id = 4 GROUP BY `ch`.`entry_id`

结果仅为1行。怎么样?

1 个答案:

答案 0 :(得分:7)

您正在进行分组,这意味着内部匹配的行会折叠为单个实体。例如考虑一个这样的假表:

field
-----
a
a

是的,一个字段表,有两个记录,两个记录都包含值a

SELECT *
FROM table
GROUP BY field

group by会找到所有具有相同值的字段,然后将它们折叠为SINGLE记录,这样您的两个a记录就会在结果集中成为一行,最后你会得到

field
-----
a

但是在做

SELECT count(*)
FROM table
GROUP BY field

改变一切。现在,DB将逐字计算将多少记录折叠到结果集的单行中。所以你仍然在结果集中得到一个SINGLE行,其中包含group by折叠了多少行的计数:

count(*)
--------
2

一行,值为2,因为有两行a

现在,如果你有一张包含更多记录的表:

field
-----
a
a
b
c
c
c

你会得到:

SELECT * ... GROUP BY field

field
-----
a
b
c

SELECT count(*), field ... GROUP BY field

count(*)   field
----------------
2          a
1          b
3          c

再次,3行结果,但请注意计数如何表示原始表中每个分组字段的数量。