Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql M:N关系查询_Mysql_Sql - Fatal编程技术网

Mysql M:N关系查询

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

我对特定的mysql查询和特定的构造有一些问题。
共有两个表格:

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,它非常有效。在我的测试中,问题在于内联视图的创建。现在它起作用了。谢谢你,米克洛斯,效果很好。在我的测试中,问题在于内联视图的创建。现在它起作用了。谢谢