2015-03-06 3 views
0

Мне нужна помощь с запросом SQL.SQL - Получить логические значения для каждого поля соответствия

У меня есть 3 таблицы:

Таблица Пользователь

id name 
1 Jon 
2 Jack 
3 Bill 

Таблица Тип

id name 
1 View 
2 Edit 
3 Delete 

Таблица правой

id user type 
1 1  1 
2 1  2 
3 1  3 
4 2  1 
5 3  1 

Стол Правый содержит связанные пары типа пользователя. Мне нужен запрос, который получает имя пользователя и значение boolean (BIT) для каждого enrty в таблице Тип, который существует в Право таблица для этого пользователя. Что-то вроде этого для моих таблиц примеров:

Username View Edit Delete 
Jon  1  1  1 
Jack  1  0  0 
Bill  1  0  0 

Большое спасибо!

+0

Является ли это SQL Server или MySQL? Это совершенно разные продукты. – Zane

+0

это MySQL, я удалил неправильный тег, спасибо. – Viceromag

ответ

0

непроверенный:

select name, 
     coalesce(select 1 from `right` where `type` = 1 and right.user = user.id, 0) as `View`, 
     coalesce(select 1 from `right` where `type` = 2 and right.user = user.id, 0) as `Edit`, 
     coalesce(select 1 from `right` where `type` = 3 and right.user = user.id, 0) as `Delete` 
from User 

В качестве альтернативы:

select name, coalesce(RVIEW.R, 0) as `View`, coalesce(REDIT.R, 0) as `Edit`, coalesce(RDEL.R, 0) as `Delete` 
from User 
left join (select 1 R from `right` where `type` = 1) RVIEW on (right.user = user.id) 
left join (select 1 R from `right` where `type` = 2) REDIT on (right.user = user.id) 
left join (select 1 R from `right` where `type` = 3) RDEL on (right.user = user.id) 
0

В вашем примере, вы используете зарезервированные слова в качестве имен таблиц.

Если вы хотите узнать больше о именовании для имен таблиц, посмотрите на ссылки в ранее вопрос о Stack Overflow here

Пример еще ниже показан другой способ получения данных, которые вы хотите (с другими имена для таблиц):

select person.name as Username 
,  max(if(person_right.type_id = 1, 1, 0)) as `View` 
,  max(if(person_right.type_id = 2, 1, 0)) as `Edit` 
,  max(if(person_right.type_id = 3, 1, 0)) as `Delete` 

from person 

left outer join person_right 
on person_right.user_id = person.id 

group by person.name 
order by person.id 

Другое дело, что может быть стоит посмотреть на это DataModel, потому что права, как правило, довольно «фиксированный».

Если кто-то случайно изменил одно из имен в таблице Type, у вас может возникнуть серьезная проблема с безопасностью.

Что вы можете сделать, это изменить person_right таблицу, чтобы посмотреть, как этот

windowid user_id view_access edit_access delete_access 
1   1  1   1   1 
1   2  1   0   0 
1   3  1   0   0 

, где первичный ключ будет window_id + user_id позволяет Вам установить различные права для каждого пользователя в конкретном окне/часть вашего приложения ,

Надеюсь, это поможет.

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