Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL-连接三个表并添加条件?_Postgresql - Fatal编程技术网

PostgreSQL-连接三个表并添加条件?

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

PostgreSQL数据库中有三个表,如下所示:

一个用户可以属于多个项目,一个项目可以有多个用户,我通过一个名为“userprojects”的联接表将其绑定在一起

每个表可以如下所示:

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
是project
RCPP
的所有者,但由于在
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因此,如果用户是一个项目的所有者,并且是另一个项目的成员,那么他们的名字会出现两次?