我遇到一些问题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。
我几乎阅读了上面提到的所有建议链接,但没有一个有用:(
到目前为止感谢! :)
答案 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
----------------