2014-09-11 71 views
1

我被困在最后2个小时试图弄清楚如何使这个查询或找到一个例子,直到现在没有搜索结果,所以我会在这里发布什么是我的问题。我有一组用户,并且我需要获取值的具体顺序。从select中选择case/if语句取决于条件

所以第1组是管理员,他可以看到所有的群体,对他的查询来获取值将

SELECT g1.group_id,g1.description FROM groups g1 ORDER BY g1.description 

其他团体可以看到,除了管理员组的所有组(ID在这种情况下是1)其他用户的查询来获取值是:

SELECT g2.group_id,g2.description FROM groups g2 WHERE g2.group_id > 1 ORDER BY g2.description 

我试着与CASE语句的东西,但是这是行不通的,我知道,子查询不能返回超过1行,我得到这样的错误

[Err] 1242 - Subquery returns more than 1 row 

我查询到现在,错误之一:

SELECT 
CASE WHEN (SELECT ug.group_id FROM users_groups ug 
     WHERE ug.login="admin" and ug.group_id = 1) 
    THEN (SELECT g1.group_id,g1.description FROM groups g1 ORDER BY g1.description) 
    ELSE (SELECT g2.group_id,g2.description FROM groups g2 WHERE g2.group_id > 1 ORDER BY g2.description) 
END 

所以我需要根据组登录的用户的结果,如果用户是管理员和他的团队= 1比他能看到所有群体,以其他方式除了组1之外的所有组,管理

任何帮助将不胜感激,最重要的是,我得到的价值在这个顺序,只有这两个g1.group_id,g1.description或g2.group_id,g2 .description

期望的输出将是:

对于用户管理员 -

group_id description 
1  Administrator 
2  Customer 
3  Supplier 

对于用户未管理员 -

group_id description 
2  Customer 
3  Supplier 
+0

如果您喜欢,请考虑遵循以下简单的两步操作步骤:1.如果您尚未这样做,请提供适当的DDL(和/或sqlfiddle),以便我们可以更轻松地复制问题。 2.如果您尚未这样做,请提供与步骤1中提供的信息相对应的所需结果集。 – Strawberry 2014-09-11 12:08:31

+0

更新了问题 – enigmaticus 2014-09-11 12:11:18

回答

2
SELECT g.group_id, g.description 
FROM groups AS g 
CROSS JOIN user_groups AS ug 
WHERE ug.login = @username 
AND (ug.group_id = 1 OR g.group_id > 1) 
ORDER BY g.description 

@username是用于执行查询的用户名的占位符。

+0

太棒了,您帮了我很多,现在我会读一下关于交叉连接:) – enigmaticus 2014-09-11 12:48:58

+2

'CROSS JOIN'只是一个完整的交叉产品,它在表格之间没有连接条件。但'WHERE ug.login = @ username'将它限制在表中的一行。 – Barmar 2014-09-11 12:50:02