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 )
我建议您重命名users
和projects
中的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 - 从一个表中选择,同时在另外两个表之间进行内部连接(多对多表和另一个表)的主要内容,如果未能解决你的问题,请参考以下文章