1

我对DATABASE DESIGN.Given 遇到了一些麻烦,如下表:

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'

附言

我已经阅读了上面几乎所有建议的链接,但它们都没有帮助:(

到目前为止感谢!:)

4

2 回答 2

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在这里

于 2013-04-21T12:05:38.700 回答
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(mode+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
----------------
于 2013-04-21T12:18:58.617 回答