我试图提取每个用户组的信息,同时计算每个用户组的用户数.计数有效,但是如果一个组不包含任何用户,则它不会检索信息 - 它只会被忽略.
这是我的查询:
SELECT
g.*,
count(u.username) as total,
u.usergroup
FROM
usergroups as g,
users as u
WHERE
u.usergroup = g.g_id
GROUP BY
g.group_name
Run Code Online (Sandbox Code Playgroud)
这是我的"用户"和"用户组"表的一部分:
Sample usergroups table structure
+--------------------------+---------------+
| Field | Type |
+--------------------------+---------------+
| g_id | int(10) |<- the user group's ID.
| group_name | varchar(255) |<- the name of the user group
+--------------------------+---------------+
Sample users table structure
+--------------------------+---------------+
| Field | Type |
+--------------------------+---------------+
| id | int(10) |<- the user ID
| username | varchar(255) |<- the username
| usergroup | int(10) |<- ID of the user group the user is in
+--------------------------+---------------+
Run Code Online (Sandbox Code Playgroud)
我不知道我错过了什么 - 但话说回来,我对更复杂的查询(如果你可以这么称呼它)很新.
任何帮助将非常感谢!
你想要一个left join,而你正在做一个inner join:
SELECT
g.*,
count(u.username) as total,
u.usergroup
FROM
usergroups as g
left join users as u on
g.u_id = u.usergroup
GROUP BY
g.u_id,
g.group_name
Run Code Online (Sandbox Code Playgroud)
现在我引起了你的注意,我想花点时间讨论一下加入条件是什么.看,当你第一次学习MySQL时,他们会教你使用的语法.对于某些问题,嘿,它的效果很好.不幸的是,它会让你将"连接条件"等同于"where predicate",这是一个问题.
在这种情况下,我们说,"嘿,MySQL,抓住我所有的东西usergroups,并试图找到一个匹配的users表,其中u_id列usergroups等于usergroup列users.如果你找不到任何东西,没关系,usergroup无论如何users都要带回来,然后把那些带到桌子上的列归零."
以前,你说:"嘿,MySQL的,抢我所有的东西出来的usergroups和users表,但只有在u_id从柱usergroups的匹配usergroup列从users".
如果你用inner join语法完成它,就像这样:
SELECT
g.*,
count(u.username) as total,
u.usergroup
FROM
usergroups as g
inner join users as u on
g.u_id = u.usergroup
GROUP BY
g.u_id,
g.group_name
Run Code Online (Sandbox Code Playgroud)
你会说,"嘿,MySQL,从usergroups表中抓住我的所有内容,然后去查找users表中u_id等于的所有内容usergroup.如果找不到匹配项,我不希望看到该用户组出现在结果.
因此,要清楚,where谓词过滤结果集,而连接条件将一个表映射到另一个表.
| 归档时间: |
|
| 查看次数: |
438 次 |
| 最近记录: |