postgresql select where condition in another table

问题描述 投票:0回答:4

我有三张桌子

  1. project (id, user_id, project_name)
  2. project_roles (id, user_id, project_id)
  3. 用户(id,昵称)

我想为 ID 为 1 的用户获取所有项目 我还想获得该用户在 project_roles 中有记录的项目

所以,如果用户有项目 A 和 B,并且该用户在项目 C 的 project_roles 中有行,我想获取项目 A、B 和 C

我试过这个:

SELECT *
from project
WHERE user_id = 1
   OR (project.id = project_roles.project_id WHERE project_roles.user_id = 1)

示例数据:

用户表

  1. id: 1, 昵称: 'test'

项目表

  1. id: 7777, user_id: 2, project_name: 'NAME1'
  2. id: 8888, user_id: 1, project_name: 'NAME2'
  3. id: 9999, user_id: 1, project_name: 'NAME3'

PROJECT_ROLES 表

  1. id: 5, user_id: 1, project_id: '7777'

我想为用户 1 获取所有 3 个项目,因为 ID 为 8888 和 9999 的项目有 user_id: 1 并且有 project_roles 数据,其中 user_id 是 1 所以我也想获得项目 7777

sql postgresql where-clause
4个回答
2
投票

谢谢大家帮助我

SELECT DISTINCT project.id, project.user_id, project.project_name
FROM project
LEFT JOIN project_roles ON project.id = project_roles.project_id
WHERE project.user_id = 1 OR project_roles.user_id = 1;

这是对我有用的答案。


0
投票

试图复制示例数据,它与您提供的有点不同,但上下文是相同的。

模式(MySQL v8.0)

CREATE TABLE project 
(
    id  INT,
    project_name    VARCHAR(512),
    user_id INT
);

INSERT INTO project (id, project_name, user_id) VALUES ('1', 'A', '23');
INSERT INTO project (id, project_name, user_id) VALUES ('2', 'B', '42');
INSERT INTO project (id, project_name, user_id) VALUES ('4', 'D', '23');
INSERT INTO project (id, project_name, user_id) VALUES ('1', 'A', '19');
INSERT INTO project (id, project_name, user_id) VALUES ('3', 'C', '15');
INSERT INTO project (id, project_name, user_id) VALUES ('3', 'C', '29');
INSERT INTO project (id, project_name, user_id) VALUES ('2', 'B', '19');
INSERT INTO project (id, project_name, user_id) VALUES ('3', 'C', '19');



CREATE TABLE project_roles  
(
    id  INT,
    project_id  VARCHAR(512),
    user_id INT
);

INSERT INTO project_roles (id, project_id, user_id) VALUES ('1', '1', '23');
INSERT INTO project_roles (id, project_id, user_id) VALUES ('2', '2', '42');
INSERT INTO project_roles (id, project_id, user_id) VALUES ('3', '4', '23');
INSERT INTO project_roles (id, project_id, user_id) VALUES ('4', '1', '19');
INSERT INTO project_roles (id, project_id, user_id) VALUES ('5', '3', '15');
INSERT INTO project_roles (id, project_id, user_id) VALUES ('6', '3', '29');
INSERT INTO project_roles (id, project_id, user_id) VALUES ('7', '2', '19');
INSERT INTO project_roles (id, project_id, user_id) VALUES ('8', '3', '19');


CREATE TABLE users   
(
    id  INT,
    nickname VARCHAR(512)
);

INSERT INTO users (id, nickname) VALUES ('23', 'John');
INSERT INTO users (id, nickname) VALUES ('42', 'Doe');
INSERT INTO users (id, nickname) VALUES ('19', 'James');
INSERT INTO users (id, nickname) VALUES ('15', 'Mark');
INSERT INTO users (id, nickname) VALUES ('29', 'Peter');

查询#1

SELECT distinct U.id, U.nickname, PR.project_id, P.project_Name FROM users U
INNER JOIN project_roles PR ON PR.user_id = U.id
INNER JOIN project P ON P.id = PR.project_id
where  U.id = 19;
id 昵称 project_id 项目名称
19 詹姆斯 1 A
19 詹姆斯 2
19 詹姆斯 3 C


0
投票
create table USERS (id, nickname) as select 1, 'test';

create table PROJECTS (id, user_id, project_name) as
select 7777, 2, 'NAME1'
union
select 8888, 1, 'NAME2'
union
select 9999, 1, 'NAME3';

create table PROJECT_ROLES (id, user_id, project_id) as
select 5, 1, 7777;

你应该为此使用集合运算符

union

select id, project_name
  from projects
 where user_id = 1
union
select p.id, p.project_name
  from project_roles r, projects p
 where r.user_id = 1
   and p.id = r.project_id;

  id  | project_name 
------+--------------
 7777 | NAME1
 9999 | NAME3
 8888 | NAME2

如果用户在

PROJECTS
表和
PROJECT_ROLES
表中,集合运算符
UNION
将删除重复项。


0
投票

如果用户有项目 A 和 B,并且该用户在项目 C 的 project_roles 中有行,我想获取项目 A、B 和 C

第一个查询(在 UNION 之上)返回项目表中的项目。这很简单。

第二个查询返回 project_roles 中的项目,这些项目不在该用户的项目中。还返回项目名称。这假设 projects 表不为空,并且 project_roles 中存在的每个项目至少有一个记录。

SELECT id, 
       user_id, 
       project_name, 
       'In projects table' AS msg
FROM projects
WHERE user_id = 1
UNION 
SELECT DISTINCT 
       pr.project_id, 
       pr.user_id, 
       COALESCE(pn.project_name,'Project name not available'), 
       'Not in projects table'
FROM project_roles pr
  LEFT JOIN (SELECT DISTINCT project_id, project_name FROM projects) pn 
    ON pr.project_id = pn.project_id
WHERE pr.user_id = 1
AND NOT EXISTS (SELECT 1 
                FROM projects p
                WHERE pr.user_id = p.user_id
                AND pr.project_id = p.id)
© www.soinside.com 2019 - 2024. All rights reserved.