如何从多个表中加入 SELECT,其中 SELECTS 基于不同的条件?

Posted

技术标签:

【中文标题】如何从多个表中加入 SELECT,其中 SELECTS 基于不同的条件?【英文标题】:How to JOIN SELECT from multiple tables, where the SELECTS is based on different conditions? 【发布时间】:2018-03-19 03:41:00 【问题描述】:

我有三张桌子。一张是笔记Notes,一张是用户Users,一张是用户和笔记NotesUsers之间的关系表。

用户

user_id    first_name    last_name
1          John          Smith
2          Jane          Doe

注意事项

note_id    note_name     owner_id
1          Math          1
2          Science       1
3          English       2

笔记用户

user_id    note_id   
1          1          
2          1  
2          2          
2          3      

希望您可以从 select 语句中看出我想要做什么。我正在尝试选择 user_id = 2 可以访问但不一定拥有的注释,但同时我也在尝试获取所有者的名字和姓氏。

SELECT Notes.notes_id, note_name
FROM Notes, NotesUsers
WHERE NotesUsers.note_id = Notes.note_id AND NotesUsers.user_id = 2 
JOIN SELECT first_name, last_name FROM Users, Notes WHERE Notes.owner_id = Users.user_id

我的问题是因为first_namelast_nameWHERE子句与notes的子句不同,我不知道如何查询数据。我知道这不是JOIN 的工作方式,并且 我不一定想使用JOIN,但我不确定如何构建语句,所以我把它留在了那里,以便您了解我想要做什么。

【问题讨论】:

【参考方案1】:

您可以加入 NotesNoteUsers 以检查访问权限,并加入 Users 以将用户的详细信息添加到结果中:

SELECT n.noted_id, n.note_name, u.first_name, u.last_name
FROM   Notes n
JOIN   NoteUsers nu ON n.noted_id = nu.note_id AND nu.user_id = 2
JOIN   Users u ON n.owner_id = u.user_id

【讨论】:

【参考方案2】:

您需要在此处使用主查询中的查询。 mysql 将首先返回拥有user_id = 2 的用户可以从NoteUser 访问的所有note_id,然后构建外部查询以返回所有者的first_namelast_name

    SELECT u.first_name, u.last_name, n.note_name, n.note_id
    FROM Notes AS n
    LEFT JOIN Users AS u ON u.user_id = n.owner_id
    WHERE n.note_id IN 
       (SELECT nu.note_id FROM NoteUser WHERE nu.user_id = 2)

【讨论】:

以上是关于如何从多个表中加入 SELECT,其中 SELECTS 基于不同的条件?的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL 中加入多个表 - [疑难解答]

如何在 C# Web API 中加入两个表

从多个表中加入 mysql 4.0 数据的最快方法?

SQL Alchemy奇怪的行为从同一个表中加入多个列

如何在postgres中加入带有动态标识符的表?

如何在 Spring JPA 存储库中加入多个表的结果