2016-08-20 97 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)