显示组中的用户数,甚至是空组

MrE*_*MrE 3 mysql group-by

我试图提取每个用户组的信息,同时计算每个用户组的用户数.计数有效,但是如果一个组不包含任何用户,则它不会检索信息 - 它只会被忽略.

这是我的查询:

 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)

我不知道我错过了什么 - 但话说回来,我对更复杂的查询(如果你可以这么称呼它)很新.

任何帮助将非常感谢!

Eri*_*ric 8

你想要一个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_idusergroups等于usergroupusers.如果你找不到任何东西,没关系,usergroup无论如何users都要带回来,然后把那些带到桌子上的列归零."

以前,你说:"嘿,MySQL的,抢我所有的东西出来的usergroupsusers表,但只有在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谓词过滤结果集,而连接条件一个表映射到另一个表.