Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2013, 14:02   #1
Jopses
Пользователь
 
Регистрация: 03.02.2012
Сообщений: 39
По умолчанию Создание VIEW из восьми таблиц с условиями

Здравствуйте уважаемые!

Прошу помощи в составлении вьюшки из восьми таблиц.

Состав таблиц (ни одна таблица не связанна друг с другом, чем либо):

cams_list – список камер + различные свойства и характеристики. Здесь они создаются (впоследствии заносятся в группы, на что имеется отдельный столбец cam_gr_id, где указывается ID группы камер). Из таблицы дёргается только ID камер (cam_id)
cams_users – список пользователей + различные свойства и характеристики. Здесь они создаются (впоследствии заносятся в группы, на что имеется отдельный столбец group_id, где указывается ID группы пользователей). Из таблицы дёргается только ID пользователей, логин и принадлежность к админу (user_id, user_login, is_admin)
cams_groups – список групп пользователей. Из таблицы берётся ID группы (group_id)
cams_list_groups – список групп камер. Из таблицы берётся ID группы и имя группы (cam_gr_id, cam_group_name)
cams_rules_groups – права групп пользователей на камеры по-отдельности. Из таблицы берётся статус права (crg.rule_status AS rule_status_group)
cams_rules - права пользователей на камеры по-отдельности. Из таблицы берётся статус права (cr.rule_status AS rule_status)
cams_list_rules_users - права пользователей на группы камер. Из таблицы берётся статус права (clru.rule_status AS rule_cam_status_user)
cams_list_rules_groups – права группы пользователей на группы камер. Из таблицы берётся статус права (clrg.rule_status AS rule_cam_status_group)

Условие таково, что все таблицы должны быть раздельные и только вьюшка собирает их в сводную таблицу. Окончательный смысл вьюшки в следующем: Есть ID пользователя или его имя или группа пользователей или группа камер и тп. При одном из этих условий (и указанных желаемых столбцов статусов) должны выбираться только те права, которые принадлежат данному пользователю или группе и тд. Ни чего лишнего и вторичного.

Ниже приведён код, который почти, но не совсем подходит под условия. Он прошёл уже около 15 стадий изменении и модификации, но нужного результата так и не достиг. Проблема явно в условиях склеивания и LEFT JOIN. Где то, что то я упускаю. Но уже не способен смотреть равнодушно и трезво на этот код. Я понимаю, что он не маленький и при взгляде на него слегка мутит, но может всё же у Вас найдётся сил выявить мою оплошность.

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

Отвечу на любые вопросы, если что не понятно.

Заранее благодарю всех кто откликнется


Код:
CREATE VIEW v_r_g2 (cam_id, user_id, group_id, cam_gr_id, user_login, cam_group_name, allowed_to_all, is_admin, rule_status, rule_status_group, rule_cam_status_group, rule_cam_status_user, result) AS
 

SELECT distinct cl.cam_id AS cam_id,
 cu.user_id AS user_id,
 cg.group_id AS group_id,
 clg.cam_gr_id AS cam_gr_id,
 cu.user_login AS user_login,
 clg.cam_group_name AS cam_group_name,
 cl.allowed_to_all AS allowed_to_all,
 cu.is_admin AS is_admin,
 cr.rule_status AS rule_status,
 crg.rule_status AS rule_status_group,
 clrg.rule_status AS rule_cam_status_group,
 clru.rule_status AS rule_cam_status_user,
 
(CASE WHEN ((cl.allowed_to_all > 0) AND ISNULL(clrg.rule_status) AND ISNULL(clru.rule_status) AND ISNULL(crg.rule_status) AND ISNULL(cr.rule_status) AND (cu.is_admin = 0)) THEN cl.allowed_to_all
 
WHEN ((clrg.rule_status IS NOT NULL) AND ISNULL(clru.rule_status) AND ISNULL(crg.rule_status) AND ISNULL(cr.rule_status)AND (cu.is_admin = 0)) THEN clrg.rule_status
 
WHEN ((clru.rule_status IS NOT NULL) AND ISNULL(crg.rule_status) AND ISNULL(cr.rule_status) AND (cu.is_admin = 0)) THEN clru.rule_status
 
WHEN ((crg.rule_status IS NOT NULL) AND ISNULL(cr.rule_status) AND (cu.is_admin = 0)) THEN crg.rule_status
 
WHEN ((cr.rule_status IS NOT NULL) AND (cu.is_admin = 0)) THEN cr.rule_status
 
WHEN (cu.is_admin > 0) THEN cu.is_admin ELSE 0 END) AS result
 
FROM ((cams_list cl JOIN cams_users cu JOIN cams_groups cg)
 LEFT JOIN cams_list_groups clg ON (clg.cam_gr_id = cl.cam_gr_id)
 LEFT JOIN cams_rules_groups crg ON ((crg.group_id = cg.group_id) AND (crg.cam_id = cl.cam_id))
 LEFT JOIN cams_rules cr ON ((cr.user_id = cu.user_id) AND (cr.cam_id = cl.cam_id))
 LEFT JOIN cams_list_rules_users clru ON ((clru.cam_gr_id = cl.cam_gr_id) AND (clru.user_id = cu.user_id))
 LEFT JOIN cams_list_rules_groups clrg ON ((clrg.cam_gr_id = cl.cam_gr_id) AND (clrg.group_id = cg.group_id) AND (clrg.group_id = cu.group_id)))
Вложения
Тип файла: rar cams.rar (3.5 Кб, 4 просмотров)
Jopses вне форума Ответить с цитированием
Старый 06.02.2013, 14:14   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
cams_list cl JOIN cams_users cu JOIN cams_groups cg
А где связка между cams_list, cams_users и cams_groups? Такой запрос вернет немеренное к-во записей, собсно произведение к-ва записей в выше перечисленных таблицах
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 06.02.2013, 15:34   #3
Jopses
Пользователь
 
Регистрация: 03.02.2012
Сообщений: 39
По умолчанию

Это понятное дело, но дело в том что выборка (для вывода данных уже на странице) идёт по трём параметрам по отдельности: камеры, пользователи, группы пользователей и возможно ещё понадобится группа камер. Вся вьюшка строится лишь для того, что бы получить на каждый из указаных параметров (только что перечислил) результат в столбце result (в нём подсчитываются приоритеты прав CASE`ом, которые перекрывают один другой). Тем более не каждую таблицу можно связать условием, по причине отсутствия одинаковых столбцов. А вьюшка получается действительно значительной, но пока я другово выхода не вижу из положения)
Jopses вне форума Ответить с цитированием
Старый 06.02.2013, 15:54   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Не вижу причин не допускающих связку, если правильно понял вот вариант их связи для условия WHERE. Для join-ов чуть по другому, но идея таже. А без неё будет бред
Код:
cams_list.cam_gr_id=cams_groups.group_id AND cams_users.group_id=cams_groups.group_id
И не забывайте, что каждый раз при обращении к вьюхе из запроса её SELECT заново отрабатывает и полученная суперпозиция записей пишется во временную таблицу, отсюда производительность. Оно вам надо?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 06.02.2013 в 15:59.
Аватар вне форума Ответить с цитированием
Старый 06.02.2013, 16:08   #5
Jopses
Пользователь
 
Регистрация: 03.02.2012
Сообщений: 39
По умолчанию

cam_gr_id - это ID группы камер
group_id - это ID группы ползователей
Не связывается)
Ещё проблема в том, что cams_groups содержит все созданные ГРУППЫ пользователей.
А cams_users содержит лишь те ГРУППЫ пользователей, в которые был зачислен данный пользователь из таблицы ГРУПП.
Из этого следует, что если в cams_users у пользователей перечисленны не все ГРУППЫ пользователей из cams_groups, то некоторые ГРУППЫ могут отсутствовать. А для вывода на странице нужны все доступные ГРУППЫ (даже пустые)
Вообщем задача хуже некуда) Куда думать дальше, не знаю
Jopses вне форума Ответить с цитированием
Старый 06.02.2013, 16:34   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Тогда копайте в строну использования UNION в запросе вьюхи. А суперпозиция последнее дело
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание формулы с несколькими условиями MuseuMouse Microsoft Office Excel 3 26.08.2012 06:27
Выборка данных из разных таблиц с несколькими условиями KorBez Microsoft Office Access 0 12.04.2012 16:28
Создание 2-х табл (1 сложная) с условиями Beliy.IV Microsoft Office Excel 2 02.11.2011 23:41
Создание таблиц в БД tanek Помощь студентам 2 25.05.2011 09:37
Задача о восьми ферзях на Nemerle natalya_57 Помощь студентам 3 08.07.2010 11:36