COUNT(*)返回错误的数字

Ole*_* IY 0 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`
Run Code Online (Sandbox Code Playgroud)

它返回 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`
Run Code Online (Sandbox Code Playgroud)

结果只有1行.怎么会这样?

Mar*_*c B 7

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

field
-----
a
a
Run Code Online (Sandbox Code Playgroud)

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

SELECT *
FROM table
GROUP BY field
Run Code Online (Sandbox Code Playgroud)

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

field
-----
a
Run Code Online (Sandbox Code Playgroud)

但是这样做

SELECT count(*)
FROM table
GROUP BY field
Run Code Online (Sandbox Code Playgroud)

改变一切.现在,DB将逐字计算将多少记录折叠到结果集的单行中.因此,您仍然在结果集中获得SINGLE行,其中包含由以下各项折叠的行数group by:

count(*)
--------
2
Run Code Online (Sandbox Code Playgroud)

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

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

field
-----
a
a
b
c
c
c
Run Code Online (Sandbox Code Playgroud)

你会得到:

SELECT * ... GROUP BY field

field
-----
a
b
c

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

count(*)   field
----------------
2          a
1          b
3          c
Run Code Online (Sandbox Code Playgroud)

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