2013-10-28 50 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