加入三个表以创建一个访问授权列表

时间:2012-01-07 22:07:56

标签: mysql join

我有三个表要加入以启动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_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,而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'

当Jill登录时,此MySQL查询会给我以下内容。

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

我现在想要将ACCESS表引入此Query中,这样如果Jill已登录,则会显示与上述相同的结果,如果Jack已签名,他将获得以下结果。

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

我希望我解释正确,因为我确实需要帮助最后一部分。我不太确定如何将其添加到当前Query。我可以使用多个查询来完成 - 但我更愿意,如果可能的话,我希望将其保留为一个查询。

2 个答案:

答案 0 :(得分: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”表来授予其他人访问所有文件或仅访问特定文件的权限。 / p>

答案 1 :(得分: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

使用多表JOIN,你必须要小心,因为这种连接操作的内存占用量非常大,特别是如果表很大 - 我假设它们是(或者只要你的应用程序选择它们)很多用户流量)。有时,分离查询并不是一件坏事。

只是我的2美分...... HTH

阿斯温