SQL:选择A而不是B的集合

时间:2017-03-07 10:44:05

标签: mysql sql

我有两个表:左边一个是users_projects,右边一个是项目: enter image description here

我想选择用户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都是其中的一部分。

感谢您的帮助!

2 个答案:

答案 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