我找到了关于这项任务的几个主题,但所有人都没有真正帮助我,或者我没有足够的经验来理解它。
我正在使用mysql并有两个表user
和user_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 |
------------------
我想,我只是以错误的方式组合命令。
答案 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)
它不会将左连接转换为内连接。当链接到用户时,它只是来自user_rh的uid分组。您有3种不同的uid(NULL,2和1),这就是为什么结果中只有3行。
使用分组子句时,只能选择具有分组聚合的字段(如COUNT,SUM,AVG ..)或group子句中可用的字段。您可以省略分组,但Mysql会进行分组,但结果可能不可靠,因为它会选择第一个可用的分组。这就是为什么你的3行结果中显示 Bob 的原因。