SQL - 从一个表中选择,同时在另外两个表之间进行内部连接(多对多表和另一个表)

Posted

技术标签:

【中文标题】SQL - 从一个表中选择,同时在另外两个表之间进行内部连接(多对多表和另一个表)【英文标题】:SQL - SELECTING from one table while INNER JOINING between two others (many-to-many table and another table) 【发布时间】:2022-01-19 11:08:50 【问题描述】:

我是 Web 编程和 SQL 的初学者。我不习惯使用具有多对多关系的表,由于缺乏知识,我在这里遇到了问题。

这些是我的桌子,这就是我想做的:

表用户

ID | Users
-----------------
1  | John
2  | Mark
3  | Sophia

表格项目

ID | Projects
-----------------
1  | Generic Name nº 1
2  | Generic Name nº 2
3  | Generic Name nº 3

表 users_projects

UsersID | ProjectsID
-----------------
    1   |    1
    2   |    1
    2   |    2
    3   |    2
    3   |    3

我想选择 Projects.Id 值为 1 的所有用户,同时保持这两个表之间的多对多关系。我该怎么做?

期望的输出

ID | Users
-----------------
1  | John
2  | Mark

【问题讨论】:

请添加您想要的输出(作为文本表) 表项目未在您想要的输出中使用,为什么要提及它? 【参考方案1】:
SELECT t1.*
FROM users t1
JOIN users_projects t2 ON t1.id = t2.usersid

SELECT *
FROM users t1
WHERE EXISTS ( SELECT NULL
               FROM users_projects t2 
               WHERE t1.id = t2.usersid )

我建议您重命名usersprojects 中的ID 列,并为它们分配与users_projects 中相同的名称。这将消除歧义,并使您的结构和查询更加清晰。

【讨论】:

【参考方案2】:

您可以在下面尝试,通过使用左连接来指定要连接的字段。 您可以使用表别名并在字段前加上别名,以指示字段在哪个表之间链接。

select u.Users, u.ID, p.Projects, p.ID
from Users u
left join user_project up
on u.ID = up.UsersID
left join projects p
on up.ProjectsID = p.projects
order by u.Users, p.Projects

【讨论】:

LEFT JOIN 不只提供匹配行的选择。您的查询输出与所需的不匹配。 不需要左连接和不需要的表项目【参考方案3】:

如果您想要Projects.Id value is 1 的结果,请尝试:

select u.ID,u.Users
from users u
inner join users_projects p on u.ID=p.UsersID
where p.ProjectsID=1;



CREATE TABLE  users (
 ID int,
 Users varchar(10) );

INSERT INTO users VALUES
(1,'John'),
(2,'Mark'),
(3,'Sophia');

CREATE TABLE  users_projects (
 UsersID int,
 ProjectsID int );

INSERT INTO users_projects VALUES
(1,1),
(2,1),
(2,2),
(3,2),
(3,3);

结果:

ID  Users
1   John
2   Mark

演示:https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=463a1cfac69f07d41a2caa440decdb25

【讨论】:

以上是关于SQL - 从一个表中选择,同时在另外两个表之间进行内部连接(多对多表和另一个表)的主要内容,如果未能解决你的问题,请参考以下文章

SQL数据库 新表里的数据都从另外两个基本表中获得

SQL多表链接查询、嵌入SELECT语句的子查询技术

从sql中的两个表中选择

SQL从具有内连接和限制的两个表中选择[重复]

SQL从具有内连接和限制的两个表中选择[重复]

SQL从具有内连接和限制的两个表中选择[重复]