1

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で作成することもできますが、可能であれば1つのクエリでこれを行いたいです。

条件付きグループがなければ、どのモードが選択されるかは完全にランダムに見えます。

さらにモードは値を持つ列挙型です

'denied', 'read', 'edit'

PS

上記のほぼすべての推奨リンクを読みましたが、どれも役に立ちません:(

これまでありがとう!:)

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

上記の記事のコメントの 1 つでわかるように、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 に答える