MYSQL LEFT JOIN和COUNT和GROUP BY

时间:2015-01-16 14:14:33

标签: mysql count group-by left-join

我找到了关于这项任务的几个主题,但所有人都没有真正帮助我,或者我没有足够的经验来理解它。

我正在使用mysql并有两个表useruser_rh。我想要一个用户名的列表(按名称排序)以及user_rh中对应的条目数。

      `user`                `user_rh`
------------------     ------------------
| `uid` | `name` |     | `uid` | `zaid` |
------------------     ------------------
|   1   | Bob    |     |   2   |    4   |
|   2   | John   |     |   2   |    7   |
|   3   | Fred   |     |   3   |    2   |
|   4   | Peter  |     ------------------
------------------

所以结果应该是这样的:

--------------------
| `name` | `count` |
--------------------
| Bob    |    0    |
| Fred   |    1    |
| John   |    2    |
| Peter  |    0    |
--------------------

我尝试了这个查询:

SELECT
    `user`.`name`,
    `user_rh`.`uid`
FROM
    `user`
LEFT JOIN
    `user_rh`
ON (`user_rh`.`uid`=`user`.`uid`)
ORDER BY
    `user`.`name`

它以正确的方式进行,但这不会返回计数值:

------------------
| `name` | `uid` |
------------------
| Bob    |  NULL |
| John   |   2   |
| John   |   2   |
| Fred   |   1   |
| Peter  |  NULL |
------------------

我以为我只是添加了COUNT()和GROUP BY命令:

SELECT
    `user`.`name`, 
    COUNT(`user_rh`.`uid`) AS `count`
FROM
    `user`
LEFT JOIN
    `user_rh`
    ON (`user_rh`.`uid`=`user`.`uid`)
GROUP BY
    `user_rh`.`uid`
ORDER BY
    `user`.`name`

但它告诉我这样的事情。首先,它提供了一个有count!= 0的名称的排序列表,列表的最后一个条目是user = 0的表count的第一个条目。

------------------
| `name` | `uid` |
------------------
| John   |   2   |
| Fred   |   1   |
| Bob    |   0   |
------------------

我想,我只是以错误的方式组合命令。

2 个答案:

答案 0 :(得分:6)

你的第二个查询没问题。只需用户从第一个表中进行分组。否则,您可以将left join变为inner join

SELECT
    `user`.`name`, 
    COUNT(`user_rh`.`uid`) AS `count`
FROM
    `user`
LEFT JOIN
    `user_rh`
    ON (`user_rh`.`uid`=`user`.`uid`)
GROUP BY
    `user`.uid, `user`.`name`
ORDER BY
    `user`.`name`

答案 1 :(得分:2)

  1. 它不会将左连接转换为内连接。当链接到用户时,它只是来自user_rh的uid分组。您有3种不同的uid(NULL,2和1),这就是为什么结果中只有3行。

  2. 使用分组子句时,只能选择具有分组聚合的字段(如COUNT,SUM,AVG ..)或group子句中可用的字段。您可以省略分组,但Mysql会进行分组,但结果可能不可靠,因为它会选择第一个可用的分组。这就是为什么你的3行结果中显示 Bob 的原因。