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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание VIEW из восьми таблиц с условиями 
:(
    Опции темы
Jops
  Дата 6.2.2013, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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

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

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)))


Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  cams.rar 3,50 Kb
PM MAIL   Вверх
Akina
Дата 6.2.2013, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Jops @  6.2.2013,  14:06 Найти цитируемый пост)
Состав таблиц 

В виде работающих CREATE TABLE скриптов (без движков, комментов, лишних для задачи полей и прочей мутоты). Пардон, не заметил аттача. Снимается.

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

Маловменяемо. Попробуйте сперва показать описание тому, кто ничего не знает - если он сразу поймёт, то сюда, а если нет - в переделку.

Цитата(Jops @  6.2.2013,  14:06 Найти цитируемый пост)
ни одна таблица не связанна друг с другом, чем либо

Это про отсутствие FK? да хоть два раза. А вот логическую связь извольте указать.

Это сообщение отредактировал(а) Akina - 6.2.2013, 13:48


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

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


Шустрый
*


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

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



Объясню иначе. 
Вся вьюшка строится лишь для того, что бы получить на каждый из указаный параметр (ID пользователя, ID камеры, ID группы пользователей) результат в столбце result (в нём подсчитываются приоритеты прав CASE`ом, которые перекрывают один другой) и результат отношений остальных параметров к одному из трёх перечисленных выше.
PM MAIL   Вверх
Akina
Дата 6.2.2013, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Не хотите объяснять, не надо. Обойдёмся тем, что есть. Но ответ будет неполным.

Посмотрел дамп. Блин, а можно было его привести в человеческий вид? за каким хреном там куча ненужного дерьма? левые таблицы, напрочь ненужные инструкции, вьюшки какие-то?

Цитата(Jops @  6.2.2013,  14:06 Найти цитируемый пост)
может всё же у Вас найдётся сил выявить мою оплошность

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

Если разберусь в этом бардаке (и не надоест раньше) - выложу.


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

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


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


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

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



Вот как забавно выглядят связи (см. аттач) в опубликованном запросе (без направления, просто соответствия). Это ЯВНО неправильно.
Нарисуйте себе (хоть карандашом) правильные связи - и тогда стройте запрос.

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  1.gif 5,20 Kb


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

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


 




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


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

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