我有三张桌子
我想为 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)
示例数据:
用户表
项目表
PROJECT_ROLES 表
我想为用户 1 获取所有 3 个项目,因为 ID 为 8888 和 9999 的项目有 user_id: 1 并且有 project_roles 数据,其中 user_id 是 1 所以我也想获得项目 7777
谢谢大家帮助我
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;
这是对我有用的答案。
试图复制示例数据,它与您提供的有点不同,但上下文是相同的。
模式(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 |
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
将删除重复项。
如果用户有项目 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)