2016-08-20 62 views
0

我在我的sql請求中加入問題。JOIN SQL請求

我有兩個數據庫:

  • 第一:我存儲的圖像(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 INNOT 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

你可以使用NOT IN實現這個,而不是一個JOIN

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

此代碼從image表中選擇所有filename,其中id沒有針對用戶的id_image列表10

1

您可以使用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)