PostgreSQL-连接三个表并添加条件?
PostgreSQL数据库中有三个表,如下所示: 一个用户可以属于多个项目,一个项目可以有多个用户,我通过一个名为“userprojects”的联接表将其绑定在一起 每个表可以如下所示:PostgreSQL-连接三个表并添加条件?,postgresql,Postgresql,PostgreSQL数据库中有三个表,如下所示: 一个用户可以属于多个项目,一个项目可以有多个用户,我通过一个名为“userprojects”的联接表将其绑定在一起 每个表可以如下所示: SELECT "project".id, "project".name, "email" FROM userprojects INNER JOIN project ON userprojects.project_id = project.id INNER JOIN "user" ON userprojec
SELECT "project".id, "project".name, "email"
FROM userprojects
INNER JOIN project ON userprojects.project_id = project.id
INNER JOIN "user" ON userprojects.user_id = "user".id
用户
| id | firstname | lastname | email |
|----|-----------|----------|----------------|
| 1 | Joe | Green | joe@green.com |
| 2 | Olle | Svensson | olle@gmail.com |
| 3 | Erik | Yapp | erik@yapp.com |
项目
| id | name | owner |
|----|---------------|----------------|
| 1 | Project X | joe@green.com |
| 2 | Peanut Butter | olle@gmail.com |
| 3 | Apollo 11 | erik@yapp.com |
| 4 | RCPP | erik@yapp.com |
Userprojects
| id | user_id | project_id |
|----|---------|------------|
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 3 |
| 4 | 3 | 3 |
是否存在某种形式的内部(?)联接,让我们来查询项目中的用户(例如在userprojects
中找到的用户id),或者用户是否是项目的所有者
在上面的示例中,内部联接查询如下所示:
SELECT "project".id, "project".name, "email"
FROM userprojects
INNER JOIN project ON userprojects.project_id = project.id
INNER JOIN "user" ON userprojects.user_id = "user".id
我将退回此邮件:
| id | name | email |
|----|---------------|----------------|
| 1 | Project X | joe@green.com |
| 2 | Peanut Butter | joe@green.com |
| 3 | Apollo 11 | olle@gmail.com |
| 4 | Apollo 11 | erik@yapp.com |
如果在内部联接查询中找不到每个项目的所有者,我希望添加到查询结果中-请注意erik@yapp.com
是projectRCPP
的所有者,但由于在userprojects
表中找不到该关系,因此在查询中不会返回该关系。我是否可以通过某种方式让我的查询返回这些用户,例如:
| id | name | email |
|-----|---------------|----------------|
| 1 | Project X | joe@green.com |
| 2 | Peanut Butter | joe@green.com |
| 3 | Apollo 11 | olle@gmail.com |
| 4 | Apollo 11 | erik@yapp.com |
| (?) | RCPP | erik@yapp.com |
使用表
Project
启动联接,并将其转到左侧
联接:
SELECT
"project".id, "project".name,
COALESCE("User"."email", "project"."owner") "owner"
FROM project
LEFT JOIN userprojects ON userprojects.project_id = project.id
LEFT JOIN "User" ON userprojects.user_id = "User".id
请参阅。结果:
您可以使用表
user
创建第二个内部联接
,但是
将用户
表的电子邮件
列与项目
表的所有者
匹配的时间
SELECT p.id, P.name, email, CONCAT(u2.firstname, " ", u.lastname) as owner
FROM userprojects up
INNER JOIN project p ON(up.project_id = p.id)
INNER JOIN user u ON(up.user_id = u.id)
INNER JOIN user u2 ON(u2.email = p.owner)
隐马尔可夫模型。。这会改变查询的结构-如果在
userprojects
中向项目添加了user\u id
(即使该用户不是所有者),查询将显示添加的用户作为所有者您的代码在结果中包含“email”,并且我保留了它。这是你想要的吗?或者仅仅是project.owner?那么,如果您尝试将用户3添加到userprojects
表中的项目2中-我希望它也出现在查询中-即使erik@yapp.com
不是项目的所有者花生酱
哦,你说得对,它是,我不能让它在我的本地postgres DB中工作,但是-它可能会做一些不显示唯一值的事情吗?db fiddle看起来是正确的,但当我在终端中执行此操作时,我只会得到唯一的id,因为我在项目中的id
表中设置为uniques,事情是,我希望将所有用户添加到结果中-如果他们是项目的所有者或其userprojects
中存在userid
table@erikvm因此,如果用户是一个项目的所有者,并且是另一个项目的成员,那么他们的名字会出现两次?