使用UNION / INNER JOIN使用SQL连接3个表来绘制数据

时间:2011-11-28 11:20:10

标签: mysql sql

我有3个表,用户,组和用户组。

UserGroups拥有User id_user和Group id_group。

用户拥有id_user,而群组拥有id_group。

我的问题是:

如何从所有3个表中提取数据以实现以下目标:

  1. 列出组表中的所有组
  2. 列出已选中的UserGroup表中的组
  3. 列出不在用户表中的用户组中的用户。
  4. 列出属于UserGroup表中的组的用户。
  5. 我有以下SQL语句,但我希望将它们组合成1个sql语句。有可能??

    select * from grupos
    

    SELECT DISTINCT usuarios.id_usuario
    FROM usuarios
    WHERE usuarios.id_usuario
    NOT IN (SELECT DISTINCT id_usuario FROM usuarios_grupos)
    

    因此,第一个查询显示:

    Groups
    
    1. 约翰
    2. 第二个查询显示以下内容:

      User
       1. John
       2. Jane
       3. Tom
      
      User Group
       Empty
      
      After selection of John:
      
      User
       2. Jane
       3. Tom
      
      User Group
       1. John
      
      Instead of having the following (which I have now):
      
      User
      
       1. John
       2. Jane
       3. Tom
      
      After Selection of John:
      
      UserGroup
      
       1. John
      

      就像我上面演示的那样,如果我选择一个组和一个用户,并将其添加到用户组。用户组将显示“组,用户”。 (例如发展,汤姆)。

      但是,“组”数据表仍将显示如下:

      1. 开发
      2. 网络
      3. 项目
      4. 用户数据表将被“更新”:

        1. 简。
        2. 我尝试了以下内容,但我没有得到我想要的结果:

          SELECT grupos.id_grupo, usuarios.id_usuario
          FROM  usuarios_grupos
          INNER JOIN
          grupos
          ON
          usuarios_grupos.id_grupo = grupos.id_grupo
          INNER JOIN
          usuarios
          ON
          usuarios_grupos.id_usuario = usuarios.id_usuario
          WHERE
          usuarios.id_usuario
          NOT IN (SELECT DISTINCT id_usuario FROM usuarios_grupos)
          

1 个答案:

答案 0 :(得分:0)

列出拥有属于他们的用户的组的最简单方法是:

SELECT DISTINCT id_grupo FROM usuarios_grupos

列出的用户属于他们的群组的最简单方法是:

SELECT DISTINCT id_grupo 
FROM grupos
WHERE id_grupo
NOT IN (SELECT DISTINCT id_grupo FROM usuarios_grupos)

编辑:要列出不属于组的用户以及其中包含用户的所有组,您可以合并返回每个集的查询结果 -

SELECT DISTINCT id_usuario
FROM usuarios
WHERE id_usuario
NOT IN (SELECT DISTINCT id_usuario FROM usuarios_grupos)
UNION ALL
SELECT DISTINCT id_grupo FROM usuarios_grupos

或者您可以在一个查询中执行此操作:

SELECT DISTINCT COALESCE(ug.id_grupo, u.id_usuario)
FROM usuarios u
LEFT JOIN usuarios_grupos ug ON u.id_usuario = ug.id_usuario

(最后一个查询假设组和用户ID集之间没有重叠。)