2017-03-07 18 views
0

をBではないのセットを選択は: enter image description hereSQL:私は2つのテーブルを持っている

私は、ユーザ3が(のみP_ID 5に参加していないプロジェクトを選択します:正しいものは、プロジェクトで、users_projectsあるものを左に7)。

私は

SELECT * FROM users_projects up INNER JOIN projects p ON p.p_ID=up.p_ID WHERE up.u_ID!=3を試みたが、それはまた、私は2と3はの一部である、両方のユーザー1 P_ID返します。

ありがとうございました!

+1

... projectsテーブルの列が十分にあることを望む

;' –

+0

NOT IN IS少し危険です...私はヌルセーフではない存在を推奨します。 – jarlh

+0

@jarlh NOT EXISTSクエリを追加できますか? –

答えて

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とそれらを結合します。左結合により、users_projectsテーブルに対応する行がなくても、projectテーブルのすべての行が表示されます。これらの行には、users_projectsからNULLに設定されたすべてのフィールドがあります。

0

これはJOINクエリではなく、NOT IN()述語を持つ無相関サブセレクトのクエリです。

私は `P_ID(3 U_ID =ユーザーからのp-IDを選択)ないでuser_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 
関連する問題