2012-01-07 137 views
0

我有三個表我想加入一個MySQL查詢來檢查用戶是否有權下載照片。每張照片都有自己的訪問權限,可以是以下任一權限。加入三個表來創建一個訪問授權列表

一級 - 任何用戶都可以下載照片。
二級 - 只有有權訪問的用戶才能下載照片。

表1:FILES

FILE_ID is AUTO_INCREMENT 
USER_ID is the identifier of the user that owns the file. 
FILE_NAME is just the name of the photo. 
FILE_ACCESS is the access rights to the 2 levels noted above. 

FILE_ID | USER_ID | FILE_NAME | FILE_ACCESS 
1 | 3 | 1279141923.jpg | 1 
2 | 3 | 1279141925.jpg | 1 
3 | 3 | 1279141927.jpg | 2 
4 | 4 | 1279141929.jpg | 1 
5 | 4 | 1279141931.jpg | 2 
6 | 3 | 1279141933.jpg | 2 

表2:用戶

USER_ID is AUTO_INCREMENT 
USER_NAME is just the name of the file owner. 

USER_ID | USER_NAME 
1 | jack 
2 | jill 
3 | john 
4 | mike 

表3:ACCESS

ACCESS_ID is AUTO_INCREMENT 
USER_ID is the identifier of the user that owns the file. 
ALLOW_ID is the identifier of the user that has access all the file uploaded by user. 

ACCESS_ID | USER_ID | ALLOW_ID 
1 | 3 | 1 
2 | 3 | 4 

用戶傑克訪問下載照片1279141923.jpg1279141925.jpg1279141927.jpg那John已經上傳,而Jill只能訪問1279141923.jpg1279141925.jpg

Jack可以訪問所有三個文件,因爲文件1和2具有訪問級別1,同時他還可以訪問下載文件3,看到John已授予他完全訪問John上傳的所有文件的權限。

SELECT a.file_name, b.user_name FROM files AS a 
    JOIN users AS b ON a.user_id = b.user_id 
    WHERE a.file_access = '1' 

這MySQL查詢給了我當吉爾簽署以下。

1279141923.jpg, john (owner name) 
1279141925.jpg, john 
1279141929.jpg, mike 

我現在正在引進的訪問表到這個查詢,因此,如果吉爾在她籤顯示如果傑克簽字,他的結果與上面相同,他會得到以下結果。

1279141923.jpg, john (owner name) 
1279141925.jpg, john 
1279141927.jpg, john 
1279141929.jpg, mike 
1279141933.jpg, john 

我希望我解釋這個權利,因爲我確實需要幫助最後一部分。我不太清楚如何將其添加到當前的查詢中。我可以使用多個查詢來做到這一點 - 但我更喜歡如果可能的話將它作爲一個整體。

+0

感謝您的清理。這看起來更容易閱讀。 – Tim 2012-01-07 22:21:17

回答

0
SELECT DISTINCT(F.id), F.filename 
FROM files F, ACCESS A 
WHERE F.flie_access=1 
OR (F.user_id=2) 
OR (F.user_id = A.user_id AND A.allow_id=2); 

所以,你可以,如果它是訪問該文件:

1級(即公衆) 或者您是所有者 或你在「訪問」表中的匹配訪問入口。

您似乎已將所有用戶文件授予其他用戶,您可能需要考慮使用「USER_ACCESS」和「FILE_ACCESS」表來授予其他人訪問所有文件或特定文件的權限。

+0

我想我明白了,如果我打算有很多文件和用戶將這個易於管理?我不得不做一些研究,因爲我的SQL不匹配。 – Tim 2012-01-08 02:52:21

+0

昨晚我再次嘗試了您的查詢。我刪除了第一個OR(F.user_id = 2),我得到了我期待的結果。我必須用不同的符號進行更多的測試才能確定。 – Tim 2012-01-08 13:25:28

0

添,這裏是修改後的查詢......

SELECT F.file_name, U.user_name 
FROM files AS F 
    INNER JOIN users AS U USING (user_id) 
    LEFT OUTER JOIN access AS A USING (user_id) 
WHERE (A.allow_id = 1 AND F.file_access IN (1, 2)) 
     OR (A.allow_id IS NULL AND F.file_access = 1) 
ORDER BY F.file_id 

隨着多表連接,你必須要小心,因爲這樣的連接操作的內存佔用量都顯著大,特別是如果表很大 - 我假設他們是(或者將盡快您的應用程序拿起大量的用戶流量)。有時,分離查詢並不是一件壞事。

只是我的2美分...HTH

Ashwin

+0

我試過你的查詢,它只會提出所有訪問級別爲二的文件。我正在查找所有文件訪問權限,如果您授予權限,則需要訪問兩個文件。我添加了更多的數據,希望能夠更加明白我在找什麼。至於這些名稱是正確的,他們將顯示每個文件的所有者的名稱。 – Tim 2012-01-08 02:47:39

+0

Tim,請使用新的查詢查看我更新的答案。它正是你正在尋找的東西。添加的數據很有幫助。 – 2012-01-08 06:19:38

+0

謝謝,我也會試試這個。我確實運行了我得到的另一個解決方案,並刪除了第一個OR,並獲得了結果。還想嘗試這一個,以及更快。要回答你關於內存佔用問題,我確實有緩存設置,這應該有所幫助。 – Tim 2012-01-08 13:28:23