我有两个表:左边一个是users_projects,右边一个是项目:
我想选择用户3未参与的项目(仅限p_ID 5和7)。
我已尝试SELECT * FROM users_projects up INNER JOIN projects p ON p.p_ID=up.p_ID WHERE up.u_ID!=3
但是这也返回了p_ID 1,用户2和3都是其中的一部分。
感谢您的帮助!
答案 0 :(得分:0)
LEFT JOIN
的解决方案:
SELECT
*
FROM
projects p LEFT JOIN users_projects up ON (p.p_ID = up.p_ID AND up.u_ID = 3)
WHERE
up.u_ID IS NULL
基本上选择所有项目并使用所需用户的user_projects
加入它们。即使在project
表中没有对应的行,左连接也会显示users_projects
表中的所有行。这些行包含users_projects
设置为NULL
的所有字段,因此我们可以选择这些字段。
答案 1 :(得分:0)
这不是JOIN
查询,而是具有NOT IN()
谓词的非相关子选择的查询。
我希望projects
表的列足够......
SELECT
*
FROM
( SELECT 1,'Apple' -- input data, don't use in 'real' query
UNION ALL SELECT 5,'Banna' -- input data, don't use in 'real' query
UNION ALL SELECT 7,'Carrot' -- input data, don't use in 'real' query
UNION ALL SELECT 8,'Durian') -- input data, don't use in 'real' query
projects(p_id,p_name)
WHERE p_id NOT IN (
SELECT
p_id
FROM
( SELECT 2,1 -- input data, don't use in 'real' query
UNION ALL SELECT 2,5 -- input data, don't use in 'real' query
UNION ALL SELECT 2,7 -- input data, don't use in 'real' query
UNION ALL SELECT 3,1 -- input data, don't use in 'real' query
UNION ALL SELECT 3,8) -- input data, don't use in 'real' query
users_projects(u_id,p_id)
WHERE u_id=3
)
;
p_id|p_name
7|Carrot
5|Banna