2015-02-12 3 views
0

Я на самом деле застряли на MySql Запрос:запрос MySql управлять правами пользователей

У меня есть две таблицы:

доступа

Access Table

Версия

Version Table

Таблица версий используется для 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'); 

Заранее спасибо

ответ

2

Если предположить, что пользователь имеет максимум одну запись доступа в корень, начало и конец идентификатор доступа ссылаясь на version.id:

SELECT v.* 
FROM `access` a 
    INNER JOIN version v ON (v.root = a.root) 
WHERE a.user_id = 2 
    AND v.id >= IFNULL(a.vstart_id, 0) 
    AND (v.id <= a.vend_id OR a.vend_id IS NULL) 

Получить информацию о версии на основе минимальных и максимальных значений из связанные корневые записи

SELECT v.* 
FROM version v 
INNER JOIN(SELECT MIN(v.lvl) AS MinLvl, MAX(v.lvl) as MaxLvl, v.root 
    FROM `access` a 
    INNER JOIN version v ON (v.root = a.root) 
    WHERE a.user_id = 2 
    GROUP BY root 
) t1 ON (t1.root = v.root AND v.lvl >= t1.MinLvl AND v.lvl <= t1.MaxLvl) 

http://sqlfiddle.com/#!2/09b3c/10

Получить информацию о версии на основе лвл от vstart_id и vend_id (отметить, что лвл из vstart_id должен быть ниже, чем лвл из vend_id):

SELECT v.* 
FROM version v 
    INNER JOIN (SELECT a.root, v.lvl as StartLvl, v2.lvl AS EndLvl 
    FROM access a 
     LEFT JOIN version v ON (v.id = a.vstart_id AND v.root = a.root) 
     LEFT JOIN version v2 ON (v2.id = a.vend_id AND v2.root = a.root) 
    WHERE a.user_id = 2 
) t1 ON (t1.root = v.root 
      AND CASE WHEN StartLvl IS NULL THEN 1=1 ELSE v.lvl >= StartLvl END 
      AND CASE WHEN EndLvl IS NULL THEN 1=1 ELSE v.lvl <= EndLvl END 
) 

http://sqlfiddle.com/#!2/09b3c/28

+0

Благодарим вас за ответ! Я не знал функцию IFNULL, она кажется полезной в таких случаях. На самом деле, я не знаю, имеет ли пользователь максимум одну запись доступа для каждого корня, я бы предпочла, чтобы запрос был надежным, и предположим, что пользователь может иметь несколько записей одного корня. Кроме того, я не уверен, что сравнение идентификаторов эквивалентно сравнению уровней, потому что содержимое таблицы можно редактировать, поэтому некоторые версии могут быть удалены – Steven

+0

Что вы на самом деле хотите? Каким будет ваш результат для пользователя 2? – arnoudhgz

+0

Я добавил еще один вариант со ссылкой на скрипку, попробуйте – arnoudhgz

Смежные вопросы