Mysql 选择分组的行,即使它们不是';我不在那张桌子上

Mysql 选择分组的行,即使它们不是';我不在那张桌子上,mysql,sql,join,Mysql,Sql,Join,问SQL问题很难!如果你能想到如何更好地描述这一点,请随意更改 我有一个非常典型的设置:3个表,用户,组,和组成员 下面是一个SQL小提琴: 我想知道的是哪些组是哪些用户 所以,我在跑步: SELECT u.id, u.firstname, u.lastname, GROUP_CONCAT(m.group_id) as groups FROM group_members m, users u WHERE m.user_id = u.id GROUP BY id ORDER BY u.lastna

问SQL问题很难!如果你能想到如何更好地描述这一点,请随意更改

我有一个非常典型的设置:3个表,
用户
,和
组成员

下面是一个SQL小提琴:

我想知道的是哪些组是哪些用户

所以,我在跑步:

SELECT u.id, u.firstname, u.lastname,
GROUP_CONCAT(m.group_id) as groups
FROM group_members m, users u
WHERE m.user_id = u.id
GROUP BY id
ORDER BY u.lastname ASC
这很酷,并向我显示了用户名和他们所在的组

我的问题是,不在任何组中的用户不会出现,因为WHERE位当然与他们不匹配


如何返回不在任何组中的用户?(在上面的SQL FIDLE中,我希望Zack Jones有另一行,显示他在组0中,或者为NULL或其他!)

您应该在不确定匹配项是否可用的表上使用左连接。在您的情况下,您应该离开并加入group_members表

SELECT u.id,
       u.firstname,
       u.lastname,
       GROUP_CONCAT(m.group_id) AS groups
FROM   users
       LEFT JOIN group_members
              ON users.id = group_members.user_id
GROUP  BY id
ORDER  BY users.lastname ASC
一般使用。在这种情况下,使用左外连接


另外,不要依赖MySQL分组扩展:

在这些情况下,外部连接很有用。我交换了周围的用户和组成员,以便进行左外连接。您还应该注意避免在where子句中进行连接

SELECT u.id, u.firstname, u.lastname, GROUP_CONCAT(m.group_id) as groups 
FROM users u LEFT OUTER JOIN group_members m 
ON m.user_id = u.id 
GROUP BY id 
ORDER BY u.lastname ASC

您需要使用
组成员上
用户的
左联接

SELECT u.id, 
  u.firstname, 
  u.lastname, 
  GROUP_CONCAT(m.group_id) as groups 
FROM users u
LEFT JOIN group_members m 
  ON u.id = m.user_id
GROUP BY u.id, u.firstname, 
  u.lastname
ORDER BY u.lastname ASC
看见 或者您可以
右键加入
组成员
用户

SELECT u.id, 
  u.firstname, 
  u.lastname, 
  GROUP_CONCAT(m.group_id) as groups 
FROM group_members m
RIGHT JOIN users u
  ON m.user_id = u.id 
GROUP BY id, u.firstname, 
  u.lastname
ORDER BY u.lastname ASC
看见
在查询中,您使用的是cartisian产品。避免使用您的方法,因为它会带来太多不需要的结果,而使用联接会更快,因为它们是

这会起作用,但不必使用派生表(内联视图)来获取指定的结果集。使用派生表可能会影响性能。。。我们在需要的地方使用它们,在不需要的地方避免它们。OP查询不产生笛卡尔乘积;OP查询执行连接,连接谓词位于WHERE子句中。建议使用JOIN关键字(代替逗号运算符)并在ON子句(而不是WHERE子句)中包含JOIN谓词,这是非常正确的。我们还希望通过CLS将所有非聚合包含在组中,非常感谢!左联接或右联接有什么好处吗?@RichBradshaw除了表在语句中的位置外,
用户
表只是在
版本之间切换了位置。我想推荐一个很好的评论。我觉得很有趣,人们总是试图“编辑”一篇文章,因为代码的样式似乎不适合他们的世界,而不是看到实际的答案。
SELECT u.id, 
  u.firstname, 
  u.lastname, 
  GROUP_CONCAT(m.group_id) as groups 
FROM users u
LEFT JOIN group_members m 
  ON u.id = m.user_id
GROUP BY u.id, u.firstname, 
  u.lastname
ORDER BY u.lastname ASC
SELECT u.id, 
  u.firstname, 
  u.lastname, 
  GROUP_CONCAT(m.group_id) as groups 
FROM group_members m
RIGHT JOIN users u
  ON m.user_id = u.id 
GROUP BY id, u.firstname, 
  u.lastname
ORDER BY u.lastname ASC
SELECT 
        u.id, 
        u.firstname, 
        u.lastname,
        m.groups
FROM users u
LEFT JOIN (
            SELECT  user_id,
                    GROUP_CONCAT(m.group_id) as groups  
            FROM group_members
           ) as m on m.user_id = u.id
WHERE m.user_id = u.id
GROUP BY id
ORDER BY u.lastname ASC