powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как можно еще переписать вложенный селект для MySQL 4.0?
3 сообщений из 3, страница 1 из 1
Как можно еще переписать вложенный селект для MySQL 4.0?
    #33229761
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для сайта реализована система привелигий пользователей. Также одно из бизнес-требований к разрабатываемой системе является ограничение доступа пользователей к модулям. Связь (ограничение) осуществляется через "роль" (отношение "многие-ко-многим").

Код: plaintext
Первоначальные данные:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
-- Таблица "модули"
create table modules (
 m_id int not null auto_increment primary key,
 module_name varchar( 30 ) not null);

insert into modules (module_name) values ('Новости'), ('Статьи'), ('Каталог товаров');

-- Таблица "роли"
create table roles (
 role_id int not null auto_increment primary key,
 role_name varchar( 30 ) not null);

insert into roles (role_name) values ('admin'), ('user');

-- Таблица "доступ к модулям"
create table module_access (
 access_id int not null auto_increment primary key,
 m_id int not null,
 role_id int not null,
 access_status tinyint not null default  0 );

-- выставляем связи между ролями и модулями
insert into module_access
(m_id, role_id) values ( 1 , 1 ), ( 2 , 1 ), ( 3 , 1 ), ( 1 , 2 ), ( 2 , 2 ), ( 3 , 2 )

За управление ограничениями к модулям отвечает скрипт module_access.php, который в качестве параметра получает значение ИД_роли (role_id). По заданному коду role_id администратор выставляет доступ (поле module_access.access_status - 0 | 1) для данной роли к модулям. В случае если в систему добавлен новый модуль (-ли), то сценарий module_access.php должен предварительно автоматически добавить записи о новых модулях в таблицу module_access для текущей учетной записи с номером role_id.

Код: plaintext
допустим был добавлен новый модуль
Код: plaintext
insert into modules (module_name) values ('Чат')

Код: plaintext
для поиска новых модулей для роли $role_id в module_access.php выполнялся следующий запрос:
Код: plaintext
1.
2.
3.
4.
5.
select m.m_id, m.module_name
from modules m
where m.m_id not in 
 (select a.m_id
  from module_access a
  where a.m_id=m.m_id and a.role_id='$role_id')

Естественно под MySQL 4.1 данный запрос работал. В связи с переходом на другой хостинг, на котором установлен 4.0, запрос не работает. Поэтому надо переписать вложенный SELECT с учетом параметра $role_id.

Один из вариантов - это создать временную таблицу, в которую загрузить все ИД модулей из таблицы module_access для указанной роли $role_id, а затем выполнить LEFT JOIN для поиска недостающих записей (модулей).

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create temporary table t_1
as
 select m_id
 from module_access
 where role_id='$role_id';

select m.m_id, m.module_name
from modules m LEFT JOIN t_1 
ON m.m_id=t_1.m_id
WHERE t_1.m_id is null;

Есть ли еще другие варианты?
...
Рейтинг: 0 / 0
Как можно еще переписать вложенный селект для MySQL 4.0?
    #33230965
max(id)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А такой запрос не спасет "отца русской демократии" :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select distinct m.m_id, m.module_name
from modules mi join
     module_access a
       on ( a.m_id = m.m_id and a.role_id='$role_id' )
     right join
     modules m
     on a.m_id = m.m_id
where a.m_id is null;
.
Конечно лишний проход по таблице, зато одним запросом...
Я так понимаю таблицы эти не очень большие будут так, что вполне терпимо. Особенно если индекс по role_id добавить.
...
Рейтинг: 0 / 0
Как можно еще переписать вложенный селект для MySQL 4.0?
    #33231239
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
max(id)А такой запрос не спасет "отца русской демократии" :Может и спасет, псб :)
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как можно еще переписать вложенный селект для MySQL 4.0?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]