Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Один запрос к трем таблицам, сделать запрос более правильным и компактным.
 
 автор: egoss   (24.01.2009 в 01:21)   письмо автору
 
 

Задача, выдавать пользователю информацию о другом пользователе учитывая уровень доступа.
Есть три таблицы

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, все теоретически понятно, а вот практики нахватает.
Думаю, что можно составить более простой и компактный запрос.

Помогите, пожалуйста, упростить запрос. Заранее, всем спасибо.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования