Я на самом деле застряли на MySql Запрос:запрос MySql управлять правами пользователей
У меня есть две таблицы:
доступа
Версия
Таблица версий используется для s разорвать версии программного обеспечения. У меня есть несколько программ, которые могут иметь несколько версий.
Версии из того же «семейства» (= то же программное обеспечение) имеют общее корневое значение. В столбце lvl описывается версия программного обеспечения: v1 - уровень 0, v3 - уровень 2 и т. Д.
Таблица доступа описывает, к каким версиям пользователь имеет доступ. Доступ может быть включен или нет.
vstart_id и vend_id используются для описания первой и последней версии пользователю разрешен доступ (мы предполагаем, что vstart_id и vend_id являются ВЕ версии с тем же корнем.)
Последнее ограничение:
vstart_id | vend_id
--------------------
NULL | NULL The user can access ALL versions
3 | NULL The user can access all versions from the version n°3
NULL | 7 The user cannot access version higher than the version n°7
3 | 6 The user can access all versions from 3 (included) to 6 (included)
Я действительно не знаю, как сделать запрос ответить на следующий вопрос:
Что ве rsions пользователю n ° 2 разрешено доступ?
Вот структура базы данных и некоторые данные для тестирования
CREATE TABLE IF NOT EXISTS `access` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`enabled` tinyint(1) NOT NULL,
`root` int(11) NOT NULL,
`vstart_id` int(11) DEFAULT NULL,
`vend_id` int(11) DEFAULT NULL,
`user_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;
INSERT INTO `access` (`id`, `enabled`, `root`, `vstart_id`, `vend_id`, `user_id`) VALUES
(1, 1, 1, 2, 3, 1),
(2, 1, 2, 5, 7, 1),
(3, 1, 2, 4, NULL, 2),
(4, 1, 1, NULL, 2, 2),
(5, 1, 2, NULL, 7, 3),
(7, 1, 1, NULL, NULL, 4);
CREATE TABLE IF NOT EXISTS `version` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`root` int(11) NOT NULL,
`lvl` int(11) NOT NULL,
`title` varchar(32) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;
INSERT INTO `version` (`id`, `root`, `lvl`, `title`) VALUES
(1, 1, 0, 'A - V1'),
(2, 1, 1, 'A - V2'),
(3, 1, 2, 'A - V3'),
(4, 2, 0, 'B - V1'),
(5, 2, 1, 'B - V2'),
(6, 2, 2, 'B - V3'),
(7, 2, 3, 'B - V4'),
(8, 2, 4, 'B - V5'),
(9, 2, 5, 'B - V6');
Заранее спасибо
Благодарим вас за ответ! Я не знал функцию IFNULL, она кажется полезной в таких случаях. На самом деле, я не знаю, имеет ли пользователь максимум одну запись доступа для каждого корня, я бы предпочла, чтобы запрос был надежным, и предположим, что пользователь может иметь несколько записей одного корня. Кроме того, я не уверен, что сравнение идентификаторов эквивалентно сравнению уровней, потому что содержимое таблицы можно редактировать, поэтому некоторые версии могут быть удалены – Steven
Что вы на самом деле хотите? Каким будет ваш результат для пользователя 2? – arnoudhgz
Я добавил еще один вариант со ссылкой на скрипку, попробуйте – arnoudhgz