2012-02-07 2 views
3

У меня есть таблица, в которой хранятся пользователи. Каждый пользователь имеет ID, Name и Access Level. Три возможных варианта: Access Levels: Administrator, Manager и Simple User.Условное sql предложение WHERE на основе значений столбца

Что я хочу, это условно выбрать из этой таблицы на основе значения Access Level. Я продемонстрировать логику ниже:

  1. Если пользователь Administrator, то выберите для всех пользователей (Administrators, Managers, Simple Users)
  2. Else, если пользователь является Manager выбрать все Managers и все Simple Users
  3. Иначе, если пользователь Simple User выбрать только сам

Возможно ли это?

+3

Кто на сайте? –

+0

Я использую joomla CMS с mysql – tliokos

+0

Являются ли уровни доступа все сохраненными как строки, или они являются номерами (внешние ключи)? – StevieG

ответ

2

Обеспечение уровня доступа представляет собой целое число, которое увеличивается с фактическим уровнем доступа: Administrator = 3 менеджер = 2 User = 1

Тогда

SELECT * FROM USERS 
WHERE ACCESS_LEVEL <= (SELECT ACCESS_LEVEL FROM USERS WHERE ID = @ID) 

И просто переключить меньше знака больше, чем если бы оно было противоположным.

Относится к SQL-серверу

EDIT: Для того, чтобы получить то, что вы хотите, вы можете использовать что-то вроде этого:

SELECT id,name FROM users where ID = @id 
UNION DISTINCT 
SELECT id, name from users where access_level <= 
    (select case when access_level = 1 then 0 else access_level end 
    from users where id = @id) 

С запросом, как это вы будете выбрать всех пользователей в текущем access_level или ниже , Только исключение, если ваш access_level равен 1 (например, обычный пользователь), тогда выбирается только ваш собственный пользователь.

+0

Спасибо за ответ, но я не прояснил ситуацию. Извините, просто первый пост здесь.Я хочу что-то вроде: SELECT id, name FROM users WHERE access_level <= (выберите access_level от пользователей WHERE id = @ id) И {IF access_level = Administrator id = *} {ELSE IF access_level = Manager id = *} {ELSE IF access_level = Простой идентификатор пользователя = (SELECT id FROM users WHERE id = @id)} – tliokos

+0

Единственная проблема с вышеуказанной логикой заключается в том, что «Простой пользователь» может видеть всех других простых пользователей – tliokos

+0

Я обновил свой ответ с вашего запроса. – user829237

1

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

1

Вы можете использовать следующий код

If(access_level=='administrator'){ str query = 'select * from users';}else if(access_level=='manager'){ str query = 'select * from users where access_level!="administrator"'; }else{ str query = 'select * from users where access_level="users"'; } 
+0

К сожалению, я использую компонент Joomla, который не позволяет мне использовать php-логику. Я должен сделать это в выражении select – tliokos

1

Может быть немного излишним, но следующий хранимая процедура может быть использована для достижения того, что вы хотите:

DROP procedure IF EXISTS `listAccessibleUsers`; 

DELIMITER $$ 
CREATE PROCEDURE `listAccessibleUsers`(IN user_id INT) 
BEGIN 
    DECLARE u_access_level INT; 

    -- Select the user access level 
    SELECT access_level 
    FROM users 
    WHERE users.id = user_id 
    INTO u_access_level; 

    -- Result for simple users 
    IF u_access_level = 1 THEN 
    SELECT id, name, access_level 
    FROM users 
    WHERE users.id = user_id; 
    -- Result for admistrators and managers 
    ELSE 
    SELECT id, name, access_level 
    FROM users 
    WHERE access_level <= u_access_level; 
    END IF; 
END$$ 

DELIMITER ; 

Пример Телефонный код:

CALL listAccessibleUsers(200); 
Смежные вопросы