【问题标题】:SQL - SELECTING from one table while INNER JOINING between two others (many-to-many table and another table)SQL - 从一个表中选择,同时在另外两个表之间进行内部连接(多对多表和另一个表)
【发布时间】: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

【问题讨论】:

  • 请添加您想要的输出(作为文本表)
  • 表项目未在您想要的输出中使用,为什么要提及它?

标签: mysql sql foreign-keys many-to-many inner-join


【解决方案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

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-28
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      相关资源
      最近更新 更多