Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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
Sql 多对多关系中的复杂查询_Sql_Postgresql - Fatal编程技术网

Sql 多对多关系中的复杂查询

Sql 多对多关系中的复杂查询,sql,postgresql,Sql,Postgresql,我有两个具有多对多关系的表: TABLE USER(id, name, ...) TABLE GROUP(id, name, ...) TABLE USER_GROUP(user_id, group_id) 给定用户名列表,我希望后端向数据库发送SQL查询 此查询必须从表组中选择所有组,这些组至少包含输入列表中指定的表用户中的所有用户 请注意,输入列表包含用户名,而不是用户ID 要求: 我希望尽可能避免存储过程和数据库端脚本 输入列表必须是名称列表,而不是用户ID列表 预期成果: 输入列表用户

我有两个具有多对多关系的表:

TABLE USER(id, name, ...)
TABLE GROUP(id, name, ...)
TABLE USER_GROUP(user_id, group_id)
给定用户名列表,我希望后端向数据库发送SQL查询

此查询必须从表组中选择所有组,这些组至少包含输入列表中指定的表用户中的所有用户

请注意,输入列表包含用户名,而不是用户ID

要求:

我希望尽可能避免存储过程和数据库端脚本 输入列表必须是名称列表,而不是用户ID列表 预期成果:

输入列表用户名 预期成果小组 约翰,西莉亚 A组,C组 约翰,杰克,西莉亚 A组 杰克 A组,B组
dbfiddle

让我假设您将值作为数组传入。您可以使用:

select g.name
from groups g join
     user_groups ug
     on ug.group_id = g.id join
     users u
     on ug.user_id = u.id
where u.name = any (:input_list)
group by g.name
having count(*) = cardinality(:input_list);

是一个dbfiddle,固定数据以匹配问题中的结果。

您使用的是哪种DBMS?我使用PostgreSQL作为我的RDBMS。我用这些信息编辑了我的问题。提问并展示您已经尝试过的内容。解释失败的原因/原因。请注意特定的错误消息、意外结果等。如果预期结果正确,则您的组是错误的。例如,你错过了第2组。这就像一个符咒。非常感谢。
SELECT  string_agg(U.Name::text, ',') AS UserNames
,string_agg(G.Name::text, ',') AS GroupNames FROM User_Group AS UG
INNER JOIN Users AS U ON U.User_ID=UG.User_ID
INNER JOIN Groups AS G ON G.Group_ID=UG.Group_ID
WHERE U.Name IN ('John','Celia')
usernames | groupnames :--------- | :-------------- John,Celia | Group A,Group C
select g.name
from groups g join
     user_groups ug
     on ug.group_id = g.id join
     users u
     on ug.user_id = u.id
where u.name = any (:input_list)
group by g.name
having count(*) = cardinality(:input_list);