【问题标题】:Joining 3 tables using SQL using UNION/INNER JOIN to draw data使用 SQL 连接 3 个表,使用 UNION/INNER JOIN 绘制数据
【发布时间】:2011-11-28 11:20:10
【问题描述】:

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

UserGroups 包含用户 id_user 和组 id_group。

User 有 id_user,Group 有 id_group。

我的问题是:

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

  1. 列出组表中的所有组
  2. 列出用户组表中已选择的组
  3. 在用户表中列出不在用户组中的用户。
  4. 在 UserGroup 表中列出属于某个组的用户。

我有以下 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

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

但是,Groups 数据表仍将显示如下:

  1. 发展
  2. 网络
  3. 项目

用户数据表将被“更新”:

  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)

【问题讨论】:

  • 我建议您澄清您的问题 - 目前,我们有您的问题域的描述,以及您为回答问题而编写的查询,但没有您想要回答的问题的描述.
  • 好吧,简而言之,我试图通过在我现有的 SQL 语句中添加 Join 或 Union 来显示用户所属的组 SELECT DISTINCT usuarios.id_usuario FROM usuarios WHERE usuarios.id_usuario NOT IN (从 usuarios_grupos 中选择不同的 id_usuario)

标签: mysql sql


【解决方案1】:

列出用户所属的组的最简单方法是:

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 集之间没有重叠。)

【讨论】:

  • 嗯,但这只是在 Groups 和 User Groups 之间,我希望将 User、Groups 和 UserGroups 包括在等式中。其中,列出不属于 Groups 的用户,并列出所有包含用户的 Groups。
  • 基本上是建立Groups和Users之间的关系,但是每个表中没有Fks。两个表的唯一连接是通过用户组。
猜你喜欢
  • 2011-09-29
  • 2013-07-01
  • 1970-01-01
  • 2017-12-17
  • 2016-08-08
  • 2015-05-16
  • 2021-02-04
  • 2020-12-30
  • 1970-01-01
相关资源
最近更新 更多