2017-03-07 95 views
0

我有兩個表:左邊一個是users_projects,正確的是項目: enter image description hereSQL:選擇集合A的不是B

我想選擇用戶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的一部分。

感謝您的幫助!

+1

'從user_projects選擇PROJECTNAME其中的p_id沒有(請從用戶的P-id其中U_ID = 3);' –

+0

不在IS有點危險......我推薦使用無效的NOT EXISTS。 – jarlh

+0

@jarlh你可以添加NOT EXISTS查詢嗎? –

回答

0

LEFT JOIN A液:

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加入其中。即使users_projects表中沒有對應的行,左連接也會使project表中的所有行都出現。這些行的所有字段從users_projects設置爲NULL,因此我們可以選擇這些行。

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 
相關問題