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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> выборка из более чем двух таблиц 
V
    Опции темы
serghd
Дата 28.2.2012, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 5.10.2009

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



Здравствуйте, интересен следующий вопрос. Есть таблица пользователей, пользователь может иметь 6 различных уровней прав. Для каждого уровня прав - отдельная таблица (поля у них, допустим: id | user_id). Вопрос в том, можно ли как-то получить все уровни права пользователя не считывая отдельно каждую из таблиц прав, а одним запросом? Т.е. если его id есть в таблица_прав1, то по данному праву у объекта пользователя -  true. Также и с остальными таблицами прав.
PM MAIL   Вверх
Zloxa
Дата 28.2.2012, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161





--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
serghd
Дата 28.2.2012, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 5.10.2009

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



Цитата(Zloxa @ 28.2.2012,  19:40)
stfg Левое соединение

я в курсе о нём. Вы думаете, что в этом случае это поможет?)
PM MAIL   Вверх
Akina
Дата 28.2.2012, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Из описания ни хрена не удаётся понять. Кроме того, что ACL реализованы через одно место - право на объект есть одна сущность, и негоже размазывать её по куче таблиц

Цитата(serghd @  28.2.2012,  19:21 Найти цитируемый пост)
одним запросом?

+ stfw объединение запросов

Цитата(serghd @  28.2.2012,  19:21 Найти цитируемый пост)
не считывая отдельно каждую из таблиц прав

Проинтуичить, что ли?  smile 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
serghd
Дата 28.2.2012, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 5.10.2009

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



Цитата(Akina @ 28.2.2012,  19:59)

 Из описания ни хрена не удаётся понять.

ну как ещё описать, чтобы было понятно - хз. И так вроде по буквам разложил. 
Пусть будет пример: есть учитель, ученик и родитель. У всех свои разные права, хотя при этом все являются пользователями. 

Таблица users:
id | login

Таблица pupils:
id | user_id | class

Таблица teachers:
id | user_id | subject

Таблица parents:
id | user_id | pupil_id

После авторизации надо знать какие права у пользователя, т.к. например родитель может быть в то же время и учителем.

Цитата(Akina @ 28.2.2012,  19:59)

 Кроме того, что ACL реализованы через одно место - право на объект есть одна сущность, и негоже размазывать её по куче таблиц

Как раз-таки считаю совсем наоборот - пихать в одну общую таблицу кучу ненужных для некоторых типов пользователей информацию считаю злом, поэтому и разделил. Или вы предлагаете дополнительное поле в таблицу users с "перечислением" доступных прав? Думал, но не то это, т.к. нужна дополнительная инфа, которая отмечена в таблицах примера выше по каждому типу пользователя.


Это сообщение отредактировал(а) serghd - 28.2.2012, 20:30
PM MAIL   Вверх
Zloxa
Дата 28.2.2012, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(serghd @  28.2.2012,  20:20 Найти цитируемый пост)
После авторизации надо знать какие права у пользователя, т.к. например родитель может быть в том же время и учителем.

на счет левого соеднинеия, вы уже конечно в курсе
Код

select users.id
   ,case when pupils.user_id is null then 'N' else 'Y' end is_pupil 
   ,case when teachers .user_id is null then 'N' else 'Y' end is_teacher
   ,case when parents.user_id is null then 'N' else 'Y' end is_parent
from users
left join pupils on users.id = pupils.user_id
left join teachers on users.id = teachers.user_id
left join parents on users.id = parents.user_id
where loogn = :login


ну или через объединение, как предлагал Акина
Код

select 'is pupil' from pupils where user_id = :user_id
union all
select 'is teacher' from teachers where user_id = :user_id
union all
select 'is parent' from parents where user_id = :user_id


Но такой дизайн для ACL - да, весьма странен.  smile 


Это сообщение отредактировал(а) Zloxa - 28.2.2012, 20:40


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
serghd
Дата 28.2.2012, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 5.10.2009

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



Цитата(Zloxa @ 28.2.2012,  20:39)
Но такой дизайн для ACL - да, весьма странен.  smile

можете порекомендовать другой?
PM MAIL   Вверх
Zloxa
Дата 28.2.2012, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(serghd @  28.2.2012,  20:41 Найти цитируемый пост)
можете порекомендовать другой? 


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


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
serghd
Дата 28.2.2012, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 5.10.2009

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



Цитата(Zloxa @ 28.2.2012,  20:46)
Цитата(serghd @  28.2.2012,  20:41 Найти цитируемый пост)
можете порекомендовать другой? 


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

да нет, я вполне серьёзно спросил. Если есть способ лучше  - почему бы не использовать.
PM MAIL   Вверх
serghd
Дата 28.2.2012, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 5.10.2009

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



придумал

"SELECT 
   (SELECT COUNT(id) FROM `administrators` WHERE user_id = '".$user_id."') as admin, 
   (SELECT COUNT(id) FROM `form_masters` WHERE user_id = '".$user_id."') as form_master,
   (SELECT COUNT(id) FROM `teachers` WHERE user_id = '".$user_id."') as teacher,
   (SELECT COUNT(id) FROM `head_teachers` WHERE user_id = '".$user_id."') as head_teacher,
   (SELECT COUNT(id) FROM `pupils` WHERE user_id = '".$user_id."') as pupil,
   (SELECT COUNT(id) FROM `parents` WHERE user_id = '".$user_id."') as parent"

Вывод:
Array ( [admin] => 1 [head_teacher] => 1 [form_master] => 0 [teacher] => 1 [pupil] => 1 [parent] => 0 ) 

всё ок, в базе так и лежит. Если равно 0, то данных прав нет.


Это сообщение отредактировал(а) serghd - 28.2.2012, 22:01
PM MAIL   Вверх
Akina
Дата 28.2.2012, 22:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Месье знает толк в извращениях... но коли оно нравится - так и пусть его.
А поскольку сие явно поделка ну максимум в размере районо, то база большой не будет, производительность пофиг... сойдёт.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
serghd
Дата 28.2.2012, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 5.10.2009

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



Цитата(Akina @ 28.2.2012,  22:06)
Месье знает толк в извращениях... но коли оно нравится - так и пусть его.
А поскольку сие явно поделка ну максимум в размере районо, то база большой не будет, производительность пофиг... сойдёт.

а, ну то есть по поводу ACL вы уже не против? Ибо предложений ещё не увидел))
PM MAIL   Вверх
Akina
Дата 28.2.2012, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(serghd @  28.2.2012,  23:23 Найти цитируемый пост)
ну то есть по поводу ACL вы уже не против

Да мне по барабану... хотите делать через определённое место - делайте.
Или почитайте, как организовано хранение прав и вычисление эффективных прав в приличных файловых системах и в сервисах каталога.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
serghd
Дата 28.2.2012, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 5.10.2009

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



Цитата(Akina @ 28.2.2012,  22:27)
Цитата(serghd @  28.2.2012,  23:23 Найти цитируемый пост)
ну то есть по поводу ACL вы уже не против

Да мне по барабану... хотите делать через определённое место - делайте.
Или почитайте, как организовано хранение прав и вычисление эффективных прав в приличных файловых системах и в сервисах каталога.

если бы дело касалось c++, то на права пользователя я бы выделил тип int, и комбинировал бы их побитовыми операциями (предварительно описавши енум для работы с ними). Это наименее затратный способ. В плане БД ничего удобнее я ещё не придумал.

Это сообщение отредактировал(а) serghd - 28.2.2012, 22:39
PM MAIL   Вверх
Akina
Дата 29.2.2012, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(serghd @  28.2.2012,  23:36 Найти цитируемый пост)
В плане БД ничего удобнее я ещё не придумал.

Судя по тексту выше, у Вас MySQL. Ну так он распрекрасно умеет выполнять побитовые логические операции. 
Единственное ограничение - их результат всегда 64 бит беззнаковый, соответственно и права/маски рекомендуется хранить в том же типе.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




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


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

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