我有一个存储用户的表。每位用户都有ID
,Name
和Access Level
。三个可能的Access Levels
是Administrator
,Manager
和Simple User
。
我想要的是根据Access Level
值从该表中有条件地选择。我演示了以下逻辑:
Administrator
,则选择所有用户(Administrators, Managers, Simple Users
)Manager
选择所有Managers
和所有Simple Users
Simple User
只选择自己这可能吗?
答案 0 :(得分:2)
提供访问级别是一个随实际访问级别而增加的整数: 管理员= 3 经理= 2 用户= 1
然后
SELECT * FROM USERS
WHERE ACCESS_LEVEL <= (SELECT ACCESS_LEVEL FROM USERS WHERE ID = @ID)
只需将小于标志切换为大于相反的标志。
适用于SQL-server
编辑:为了得到你想要的东西你可以使用这样的东西:
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(例如普通用户)时才会例外,然后才会选择您自己的用户。
答案 1 :(得分:1)
答案 2 :(得分: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"'; }
答案 3 :(得分: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);