带枚举的条件组

时间:2013-04-21 11:58:33

标签: mysql sql

我遇到一些问题DATABASE DESIGN.给出的是下表:

group_id | right_id | mode
----------------------------
   1     |    1     | edit
----------------------------
   1     |    2     | edit
----------------------------
   3     |    1     | read
----------------------------
   3     |    3     | read
----------------------------
   1     |    3     | edit
----------------------------
   4     |    3     | denied
----------------------------

现在我需要第1组和第3组的所有权利。 为了防止双重结果我想用right_id对结果进行分组 问题是模式列。正如您可能建议的那样,模式决定了您是否被允许阅读或编辑某些内容(或者没有'拒绝')

我希望在最终结果中使用最高权限 第1组和第3组的权利结果应如下所示:

 right_id | mode
----------------------------
   1     | edit
----------------------------
   2     | edit
----------------------------
   3     | edit
----------------------------

必须覆盖第3组的读取模式。

我绝对不知道如何解决这个问题。我可以在php中创建这个,但如果可能的话,我想在一个查询中使用它。

如果没有一个条件组,它似乎随机选择哪种模式。

除了mode之外是带有值

的枚举
'denied', 'read', 'edit'

P.S。

我几乎阅读了上面提到的所有建议链接,但没有一个有用:(

到目前为止感谢! :)

2 个答案:

答案 0 :(得分:4)

尝试:

select right_id,
       case max(mode+0)
            when 1 then 'denied' 
            when 2 then 'read'
            when 3 then 'edit'
        end highest_privilege
from mytable
where group_id in (1,3)
group by right_id

SQLFiddle here

答案 1 :(得分:2)

你可以使用MIN / MAX函数来获得你想要的东西,因为枚举值有索引: http://dev.mysql.com/doc/refman/5.0/en/enum.html

但是你不能直接使用它们,因为MIN / MAX似乎在枚举上作为文本值使用: http://bugs.mysql.com/bug.php?id=45300

正如您在上面的一篇评论中所看到的,您可以使用f.ex:MAX(模式+ 0)并获得枚举值的索引作为回报。

SELECT right_id, MAX(mode+0) AS mode FROM table WHERE group_id IN (1, 3) GROUP BY right_id

在你的情况下哪个应该给你:

right_id | mode
----------------
1     | 3
----------------
2     | 3
----------------
3     | 3
----------------