Соедините три таблицы, чтобы создать список разрешенных прав доступа - PullRequest
0 голосов
/ 08 января 2012

У меня есть три таблицы, к которым я хотел бы присоединиться, чтобы выполнить MySQL Query, который проверит, есть ли у пользователя доступ к загрузке фотографий.Каждая фотография имеет свои собственные права доступа, которые могут быть следующими:

Первый уровень - любой пользователь может загрузить фотографию. Второй уровень - загружать фотографию могут только пользователи, имеющие доступ.

Таблица 1: ФАЙЛЫ

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.jpg, 1279141925.jpg и 1279141927.jpg, которые Джон загрузил, в то время как Джилл имеет доступ только к 1279141923.jpg и 1279141925.jpg

Джек получает доступ ко всем трем, поскольку файлы 1 и 2 имеют уровень доступа один, а также он получает доступ к загрузке файла 3, видя, что Джон предоставил ему полный доступ ко всем файлам, загруженным Джоном.

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 Query дает мне следующее при входе в систему Jill.

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

Сейчас я хочу ввести таблицу ACCESS в этот запрос, чтобы, если Jill выполнила вход, она отображалась сте же результаты, что и выше, будут, если Джек был подписан, он получит следующие результаты.

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

Я надеюсь, что объясню это правильно, так как мне, конечно, нужна помощь с последней частью.Я не совсем уверен, как добавить это в текущий запрос.Я могу сделать это, используя несколько запросов - но я предпочитаю по возможности оставить все как один.

Ответы [ 2 ]

0 голосов
/ 08 января 2012

Тим, вот модифицированный запрос ...

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 голосов
/ 08 января 2012
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 (т. Е. Общедоступный), или вы являетесь владельцем, или у вас есть соответствующая запись доступа в таблице 'ACCESS'.

Похоже, вы предоставили доступ ко ВСЕМ файлам пользователя другому пользователю. Возможно, вы захотите рассмотреть таблицу «USER_ACCESS» и «FILE_ACCESS», чтобы предоставить другим людям доступ ко всем вашим файлам или только к конкретному файлу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...