2013-10-28 40 views
1

这可能是一个简单的答案,但我一直在这个问题上,在过去的几天,和它开始把我发疯确定什么是一个多对多的关系

我有一个数据库多对多关系

 

-------------  ---------------------  ------------------- 
|Images  |  |user2img   |  |User    | 
-------------  ---------------------  ------------------- 
|imgID  |  |id     |  |UserID   | 
|imgURL  |  |imgID    |  |UserName   | 
|imgAv  |  |UserID    |  |UserEmail  | 
-------------  ---------------------  ------------------- 

user2img表指示允许用户查看哪个图像。

我试图确定一个SQL查询,它将列出每个图像(一次不重复)并告诉我指定的用户是否有权查看该图像。

所以输出一样,

(其中userid = '1')

 
---------------------------- 
|imgID | imgURL | access | 
---------------------------- 
|1  | xxx | Yes | 
|2  | yyy | No | 
|3  | qqq | Yes | 
|4  | rrr | Yes | 
|5  | www | No | 
|6  | sss | Yes | 
etc... 
---------------------------- 

感谢,

回答

0

一种可能性是(我承认不是最好的,而不是非常高效的可能)为具有通过复合键表内连接的用户选择所有匹配图像,并选择否定选项(iid在我的测试表中为图像标识):

select 
    iid, url, 'yes' 
    from user_has_image 
    inner join image on user_has_image.iid = image.id 
    inner join user on user_has_image.uid = user.id 
    where user.id = 1 
union 
select 
    iid, url, 'no' 
    from user_has_image 
    inner join image on user_has_image.iid = image.id 
    inner join user on user_has_image.uid = user.id 
    where user.id <> 1 

您可以在这个SQLFiddle session中看到结果。

+0

这也不会给我一个输出,使所有的用户没有ID为1(用户2,3,4,5,6,7,8等...以及想念imgs用户没有在user2img表中列出? –

+0

是的,但在你的问题的例子中 - 如果没有在user2image表中映射,所有用户都不是这样的情况吗?如果UserId是** NOT **出现在表格中,那么用户无法访问该图像,对于否定问题没有其他解决方案。您可以将UNION重写为** left **或** right ** join,但它会是相同 - UserId为空的每个结果都将是user2image表中所有其他用户的图像。我认为您只需检查访问权限 - 如果使用** inner join **的*连接*存在。 – pasty