Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Древовидный запрос, Необходимо реализовать аналог Oracle 
:(
    Опции темы
BlackLFL
Дата 1.11.2007, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 15.9.2005
Где: Москва

Репутация: нет
Всего: 12



Добрый день!
С Mysql почти не работал, в поиске нашел несколько решений, но, ни один не смог адаптировать под себя ...
В Oracle использую две функции connect by, start with.

Есть таблица members_priv, где храняться роли, которые предоставлены пользователю.
Создаем таблицу и предоставляем две роли members_default, test6
Код

CREATE TABLE IF NOT EXISTS `bfw_members_priv` (
  `member_id` int(11) NOT NULL default '0',
  `member_role` varchar(100) NOT NULL default '',
  KEY `member_id` (`member_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

INSERT INTO `bfw_members_priv` (`member_id`, `member_role`) VALUES
(15, 'members_default'),
(15, 'test6');


Но, роль может наследовать привелегии другой роли, для этого есть табилца members_roles_inheritance, где 
Код

CREATE TABLE IF NOT EXISTS `bfw_members_roles_inheritance` (
  `role` varchar(100) NOT NULL,
  `inheritance_role` varchar(100) NOT NULL,
  KEY `role` (`role`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

Где inheritance_role это роль, привелегии которой наследует роль role
Заполняем
Код

INSERT INTO `bfw_members_roles_inheritance` (`role`, `inheritance_role`) VALUES
('members_default', 'test'),
('test', 'test7'),
('test8', 'test7'),
('test9', 'test'),
('test10', 'members_default');

Получается, что пользователь с id 15 имеет привелегии следующих ролей
members_default
test
test7
test6

Вопрос, как мне теперь получить эти 4 роли?

Заранее благодарен за помощь и любые комментарии!!
PM WWW   Вверх
BlackLFL
Дата 1.11.2007, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 15.9.2005
Где: Москва

Репутация: нет
Всего: 12



Вот, что у меня получилось, но мне кажется жутко криво ...
Код

SELECT 
DISTINCT bfw_members_roles_inheritance.* 
FROM
bfw_members_roles_inheritance,
(
    SELECT 
    member_role AS role,
    NULL AS inheritance_role
    FROM bfw_members_priv 
    WHERE member_id = 15
    UNION ALL 
    SELECT 
    t2.inheritance_role AS inheritance_role,
    t2.role AS role
    FROM bfw_members_roles_inheritance t1, bfw_members_roles_inheritance t2
    WHERE t1.role = t2.inheritance_role 
) prinh
WHERE bfw_members_roles_inheritance.role = prinh.role
UNION
SELECT 
NULL AS role,
member_role AS inheritance_role
FROM bfw_members_priv 
WHERE member_id = 15
;

В итоге получаем role/inheritance_role

members_default        test
test                             test7
(NULL)                         members_default
(NULL)                         test6    


Это сообщение отредактировал(а) BlackLFL - 1.11.2007, 16:43
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0517 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.