Mysql M:N关系查询
我对特定的mysql查询和特定的构造有一些问题。Mysql M:N关系查询,mysql,sql,Mysql,Sql,我对特定的mysql查询和特定的构造有一些问题。 共有两个表格: table users (id, username) table groups (id, groupname) 这两个表是m:n关系,但有两个表用于此关系 首先,将用户映射到组 table usertogroups (idmaster, idslave) 其中idmaster与users.id相关,idslave与groups.id相关 第二,将组映射到用户 table groupstouser (idmaster, id
共有两个表格:
table users (id, username)
table groups (id, groupname)
这两个表是m:n关系,但有两个表用于此关系
首先,将用户映射到组
table usertogroups (idmaster, idslave)
其中idmaster与users.id相关,idslave与groups.id相关
第二,将组映射到用户
table groupstouser (idmaster, idslave)
其中idmaster与groups.id相关,idslave与users.id相关
取决于应用程序,无法更改它
现在,我想在一个查询中获得具有依赖用户的所有组,该查询具有表、groupstouser和usertogroups的关系。我试过很多说法,但是如果我把第二张桌子放进去,它就不起作用了
有什么有用的想法吗?我不确定,它可能会解决您的问题:
(SELECT * FROM usertogroups WHERE idmaster=10)
UNION
(SELECT * FROM groupstouser WHERE idslave=10)
我不确定,它可能会解决您的问题:
(SELECT * FROM usertogroups WHERE idmaster=10)
UNION
(SELECT * FROM groupstouser WHERE idslave=10)
我认为你的数据库设计是错误的 将
用户
分配给组
时,只能使用单个表。您必须在usertogroup
和groupstouser
中保存重复记录
尝试仅从单个表获取数据
SELECT * FROM usertogroups order by idslave
如果我认为您没有在两个表中保存重复数据是错误的,那么请指定拥有两个表的原因。我认为您的数据库设计是错误的 将
用户
分配给组
时,只能使用单个表。您必须在usertogroup
和groupstouser
中保存重复记录
尝试仅从单个表获取数据
SELECT * FROM usertogroups order by idslave
如果我认为您没有在两个表中保存重复数据是错误的,那么请指定拥有两个表的原因使用此作为内联视图从两个关联表中获取数据:
((SELECT idmaster AS userid, idslave AS groupid FROM userstogroup)
UNION
(SELECT idslave AS userid, idmaster AS groupid FROM groupstouser)) all_associations
然后您可以这样查询:
SELECT groups.groupname, users.username
FROM groups
INNER JOIN ((SELECT idmaster AS userid, idslave AS groupid FROM userstogroup)
UNION
(SELECT idslave AS userid, idmaster AS groupid FROM groupstouser)) all_associations
ON groups.id = all_associations.groupid
INNER JOIN users
ON users.id = all_associations.userid
这是一个。将其用作一个内联视图,以从两个关联表中获取数据:
((SELECT idmaster AS userid, idslave AS groupid FROM userstogroup)
UNION
(SELECT idslave AS userid, idmaster AS groupid FROM groupstouser)) all_associations
然后您可以这样查询:
SELECT groups.groupname, users.username
FROM groups
INNER JOIN ((SELECT idmaster AS userid, idslave AS groupid FROM userstogroup)
UNION
(SELECT idslave AS userid, idmaster AS groupid FROM groupstouser)) all_associations
ON groups.id = all_associations.groupid
INNER JOIN users
ON users.id = all_associations.userid
这是一个。您必须去掉这两个关联表中的一个。从逻辑上讲,两者都是对方的镜像。它是多余的、无用的,如果表没有保持完全同步,它可能是错误的来源。两条注释:(1)“取决于应用程序,它无法更改。”此时可能无法更改。但你应该坚决地推动逐步淘汰这种愚蠢行为。关系不是指针。它们本质上是双向的。无论是谁提出这个“解决方案”,都可能对关系数据库一无所知——或者这里确实存在一些乍一看不明显的微妙之处?(2) “我试过很多陈述,但[…]都不起作用”你能展示一下你的陈述吗?再次“乍一看”这只是一个
加入
。@MarkoKohn,而不是将标题更改为[SOLVED]
,请使用答案左侧的大勾号标记接受的答案。请参阅此处了解更多信息:您必须删除这两个关联表中的一个。从逻辑上讲,两者都是对方的镜像。它是多余的、无用的,如果表没有保持完全同步,它可能是错误的来源。两条注释:(1)“取决于应用程序,它无法更改。”此时可能无法更改。但你应该坚决地推动逐步淘汰这种愚蠢行为。关系不是指针。它们本质上是双向的。无论是谁提出这个“解决方案”,都可能对关系数据库一无所知——或者这里确实存在一些乍一看不明显的微妙之处?(2) “我试过很多陈述,但[…]都不起作用”你能展示一下你的陈述吗?再次“乍一看”这只是一个加入
。@MarkoKohn,而不是将标题更改为[SOLVED]
,请使用答案左侧的大勾号标记接受的答案。更多信息请参见此处:不,我没有保存重复数据。应用程序的设计是固定的,因此我使用这些数据并尝试生成报告。@Markohn“不,我没有保存重复的数据。”您应该在问题中明确解释为什么usertogroups
和groupstouser
不同。也许通过展示一个实际数据的例子。这是非常令人不安的--可能会导致您的问题的次优答案。不,我没有保存重复的数据。应用程序的设计是固定的,因此我使用这些数据并尝试生成报告。@Markohn“不,我没有保存重复的数据。”您应该在问题中明确解释为什么usertogroups
和groupstouser
不同。也许通过展示一个实际数据的例子。这是非常令人不安的--可能会导致你的问题的次优答案。Thnaks Miklos,它非常有效。在我的测试中,问题在于内联视图的创建。现在它起作用了。谢谢你,米克洛斯,效果很好。在我的测试中,问题在于内联视图的创建。现在它起作用了。谢谢