2015-04-29 2 views
2

У меня есть небольшая проблема, чтобы сделать рекурсивный запрос, и я не могу извлечь нужные мне данные.запрос рекурсивный и другие таблицы в postgresql?

У меня есть 3 таблицы (меню, type_role, привилегии) ​​

 
menu 
---------------------------------------------------------- 
| id| parent_id | tittle  | controller | action | 
| 1 |   | Users   |   |   | 
| 2 | 1  | Create User | users  | create | 
| 3 | 1  | Edit User  | users  | edit | 
| 4 | 1  | Show Users  | users  | show | 
| 5 |   | Contacts  |   |   | 
| 6 | 5  | Create Contacs | contacts | create | 
| 7 | 5  | Edit Contacts | contacts | edit | 
| 8 |   | Inventory  |   |   | 
| 9 | 8  | Register Piece | pieces | register | 
| 10| 8  | Show Pieces | pieces | show  | 

 
type_role 
--------------------- 
| id| role  |  
| 1 | Administrator | 
| 2 | Technical  | 
| 3 | Operator  | 

 
privilege 
--------------------- 
| role_id | menu_id |  
| 1 | 2  | 
| 1 | 3  | 
| 1 | 4  | 
| 1 | 6  | 
| 1 | 7  | 
| 1 | 9  | 
| 1 | 10  | 
| 2 | 9  | 
| 2 | 10  | 
| 3 | 6  | 
| 3 | 7  | 
| 3 | 10  | 

Мне нужно извлечь:

ID, parent_id, контроллер, действие которой идентификатор типа Роль равна 1

Я сделал запрос, и я получу данные, но запрос выведет его родителей, которые не связаны с типом o f, и мне это не нужно.

Я просто хочу, чтобы извлечь все пункты меню и их родителей по типу пользователя

SELECT menu.id,menu.parent_id,menu.controller,menu.action 
FROM privilege 
INNER JOIN menu ON 
menu.id = privilege.menu_id 
INNER JOIN type_role ON 
type_role.id = privilege.role_id 
WHERE type_role.id = 1 
UNION 
SELECT menu_recur.id,menu_recur.parent_id,menu_recur.menu_recur,menu_recur.action 
FROM menu menu_recur 
INNER JOIN menu menutwo ON 
menu_recur.id = menutwo.parent_id 

Я думаю, что я должен использовать рекурсивные, но я не работал с такого рода рекурсивных запросов

ответ

1

Вот рекурсивный запрос, который зацикливает родительские записи.

with recursive list as 
     (
     select menu.id, parent_id, tittle, controller, action 
     from menu 
     join privilege 
     on  menu.id = privilege.menu_id 
     join type_role 
     on  type_role.id = privilege.role_id 
     where type_role.role = 'Technical' 
     union all 
     select menu.id, menu.parent_id, menu.tittle, menu.controller, menu.action 
     from list 
     join menu 
     on  menu.id = list.parent_id 
     ) 
select distinct * 
from list 
order by 
     id 
; 

Это печатает:

id | parent_id |  tittle  | controller | action 
----+-----------+----------------+------------+---------- 
    8 |   | Inventory  |   | 
    9 |   8 | Register Piece | pieces  | register 
10 |   8 | Show Pieces | pieces  | show 
(3 rows) 

See it working at SQL Fiddle. Приведен пример для Technical, так как Administrator включает в себя каждую строку.

+0

WOW .... спасибо вам большое за помощь .. Вы решили мою проблему –

Смежные вопросы