|
|
|
| Задача, выдавать пользователю информацию о другом пользователе учитывая уровень доступа.
Есть три таблицы
1. Таблица с пользователями `b_users`
2. Таблица уровней доступа к данным пользователя `b_uaccess` : 0 - доступен для всех; 1 - только для друзей; 2 - Только для автора
+------------------------------+
| id | uid | email | icq | ...|
+------------------------------+
| 1 | 1 | 1 | 0 | ...|
+------------------------------+
|
В данном случае
Пользователь номер 1 разрешил смотреть свой email только друзьям а ICQ могут видеть все.
3. Таблица "Друзей", в ней хранится информация о том кто с кем дружит `b_friends`
+-----------------------+
| id | uid | fid | ...|
+-----------------------+
| 1 | 1 | 2 | ...|
+-----------------------+
|
В данном случае пользователь номер 1 дружит с пользователем номер 2.
fid - Friend ID
uid - User ID
Сначала на автомате решил задачу выдачи данных пользователю о другом пользователе в три запроса, что не есть гуд.
Вовремя опомнившись, начал искать решение получить данные одним запросом, учитывая права доступа для просматривающего.
так как раньше имел дело только с простыми запросами типа SELECT * FROM `` WHERE ``='', пока удалось сделать только такой запрос.
Вот его часть, получить емайл учитывая уровень доступа владельца к просматривающему.
P.S.
Запрос выполняется только в том случае если ID просматривающего не совпадает с ID просматриваемого.
другими словами если я сам хочу посмотреть свои данные будет выполняться другой простейший запрос, где все данные будут доступны.
/* E-mail */
SELECT
IF(
/* Если являются друзьями и доступ открыт для друзей*/
( (SELECT `email` FROM `b_uaccess` WHERE `uid`=1)=1 AND ( SELECT `id` FROM `b_friends` WHERE `uid`=1 AND `fid`=2) IS NOT NULL )
/* Или если доступ открыт для всех */
OR ((SELECT `email` FROM `b_uaccess` WHERE `uid`=1)=0),
/* Получить емайл пользователя */
(SELECT `email` FROM `b_users` WHERE `id`=1)
/* В противном случае заменимить емайл на 'access denied' в выводе результата */
,'access denied')
AS `email`
|
Но имхо ето не запрос, а безобразие.
Почитал про запросы на mysql.ru, все теоретически понятно, а вот практики нахватает.
Думаю, что можно составить более простой и компактный запрос.
Помогите, пожалуйста, упростить запрос. Заранее, всем спасибо. | |
|
|