2017-02-08 8 views
0

私は2進加算をもとに、簡単な著作権管理を設定しました。MySQLのバイナリ権に基づいて、ナビゲーション用のアイテムを選択し

私のデータベース内のすべてのナビゲーションエントリは、この構造を、以下:

Navigation Entries Table など..

すべてのユーザーは自分のアクセスレベルを持っている...

ユーザー= 3(1 + 2 - アクセスレベル) 管理= 15(1 + 2 + 4 + 8)

これまでのところ良いです。私の問題は今、MySQL経由でテーブルから対応するフィールドを選択することです。私の最初のアプローチは、access_levelを持つすべてのエントリを選択することでした。< =ユーザのアクセスレベルの合計ですが、すぐに、これも低いアクセスレベルの他のページも含まれていました。

+0

を経由して、いくつかを選択することができ、私なぜこのアプローチに尋ねますか? – PhpDude

答えて

1

あなたはバイナリを使用する必要がありますし、ビットがセットされているかどうかを確認します。設定フィールドを使用することもできます。各ビットに名前を付けるビットフィールドでもあります。

と、次のように:

WHERE (access_level & 15); 

サンプル - 表を作成し、

mysql> CREATE TABLE `access_table` (
    -> `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
    -> `item_text` VARCHAR(32) DEFAULT NULL, 
    -> `url` VARCHAR(32) DEFAULT NULL, 
    -> `access_level` SET('home','help','backend','admin') DEFAULT NULL, 
    -> PRIMARY KEY (`id`) 
    ->) ENGINE=INNODB DEFAULT CHARSET=utf8; 
Query OK, 0 rows affected (0,02 sec) 

mysql> 
mysql> INSERT INTO `access_table` (`id`, `item_text`, `url`, `access_level`) 
    -> VALUES 
    ->  (1, 'home', '/home', 'home'), 
    ->  (2, 'help', '/help', 'help'), 
    ->  (3, 'backend', '/backend', 'backend'), 
    ->  (4, 'hoadmpage', '/admin', 'admin'); 
Query OK, 4 rows affected (0,00 sec) 
Records: 4 Duplicates: 0 Warnings: 0 

mysql> 

サンプルを埋めるには - すべての行を表示し、ビット

mysql> SELECT *,access_level+0 FROM ACCESS_TABLE; 
+----+-----------+----------+--------------+----------------+ 
| id | item_text | url  | access_level | access_level+0 | 
+----+-----------+----------+--------------+----------------+ 
| 1 | home  | /home | home   |    1 | 
| 2 | help  | /help | help   |    2 | 
| 3 | backend | /backend | backend  |    4 | 
| 4 | hoadmpage | /admin | admin  |    8 | 
+----+-----------+----------+--------------+----------------+ 
4 rows in set (0,00 sec) 

mysql> 
mysql> SELECT *,access_level+0 
    -> FROM ACCESS_TABLE 
    -> WHERE (access_level & 15); 
+----+-----------+----------+--------------+----------------+ 
| id | item_text | url  | access_level | access_level+0 | 
+----+-----------+----------+--------------+----------------+ 
| 1 | home  | /home | home   |    1 | 
| 2 | help  | /help | help   |    2 | 
| 3 | backend | /backend | backend  |    4 | 
| 4 | hoadmpage | /admin | admin  |    8 | 
+----+-----------+----------+--------------+----------------+ 
4 rows in set (0,00 sec) 

mysql> SELECT *,access_level+0 
    -> FROM ACCESS_TABLE 
    -> WHERE (access_level & 7); 
+----+-----------+----------+--------------+----------------+ 
| id | item_text | url  | access_level | access_level+0 | 
+----+-----------+----------+--------------+----------------+ 
| 1 | home  | /home | home   |    1 | 
| 2 | help  | /help | help   |    2 | 
| 3 | backend | /backend | backend  |    4 | 
+----+-----------+----------+--------------+----------------+ 
3 rows in set (0,00 sec) 

mysql> SELECT *,access_level+0 
    -> FROM ACCESS_TABLE 
    -> WHERE (access_level & 9); 
+----+-----------+--------+--------------+----------------+ 
| id | item_text | url | access_level | access_level+0 | 
+----+-----------+--------+--------------+----------------+ 
| 1 | home  | /home | home   |    1 | 
| 4 | hoadmpage | /admin | admin  |    8 | 
+----+-----------+--------+--------------+----------------+ 
2 rows in set (0,00 sec) 

mysql> 
+0

これは私がここで得た最高の答えでした。どうもありがとうございます。私は解決策が簡単だろうとは決して考えなかった。ありがとう!! –

+1

申し訳ありません - ここでは、** IN **で他のものを使用していますが、** WHERE(access_level IN( 'home'、 'help'、 'admin'))); **が必要な場合は、あなたが探しているものを指定する –

関連する問題