2016-08-20 4 views
0

SQLリクエストで結合に問題があります。JOIN SQLリクエスト

私は2つのデータベースいます

  • まず:私は第2の画像(ID、ファイル名)
  • を格納します。私のウェブサイトでは、一部のユーザーは、いくつかの画像を見ることが禁じられています。私はこのデータベースにも格納します(id_image、id_user)。

ユーザーがこの第二のデータベースに表示されていない場合、彼は画像を見ることができるようです。

今、私は彼が見ることを許可するすべてのイメージをユーザのためにリストするリクエストを持っています。

これは私の実際のリクエストです(間違っています)。

SELECT 
     pi.filename, 
FROM 
    image AS pi 
INNER JOIN 
    images_forbidden AS pii 
ON 
    pi.id = pii.id_image AND pii.id_user = 10 

私を助けることができますか?

答えて

1

はあなたがいない試合を行う画像を見つけたいleft join

SELECT pi.filename 
FROM image AS pi 
LEFT JOIN images_forbidden AS pii ON pi.id = pii.id_image 
           AND pii.id_user = 10 
WHERE pii.id_image IS NULL 
1

を使用してください。 LEFT JOINは一つの方法である:

SELECT pi.filename, 
FROM image pi LEFT JOIN 
    images_forbidden pii 
    ON pi.id = pii.id_image AND pii.id_user = 10 
WHERE pii.id_image IS NULL; 

他の一般的な方法はNOT INまたはNOT EXISTSを使用します。

SELECT pi.filename 
FROM image pi 
WHERE NOT EXISTS (SELECT 1 
        FROM images_forbidden pii 
        WHERE pi.id = pii.id_image AND pii.id_user = 10 
       ); 
0

あなたが代わりにJOINのこれを達成するためにNOT INを使用することができます。

SELECT filename 
    FROM image 
    WHERE (id NOT IN (SELECT id_image 
         FROM images_forbidden 
         WHERE (id_user = 10))) 

このコードimageテーブルからすべてfilenameを選択します。ここで、idは、ユーザ10

1

ためid_imageのリストに含まれていないあなたはWHERE NOT EXISTS

SELECT 
     pi.filename 
FROM 
    image AS pi 
WHERE NOT EXISTS (SELECT 1 FROM images_forbidden 
       WHERE pi.id = id_image 
        AND id_user = 10) 

などを使用することができます