21

ユーザーテーブルがあり、ビットマスク基準でいくつかの行を選択したいと考えています。小さな例で私の問題を説明しようとします。

テーブルユーザーの構造

user_id             int           [primary key, auto_increment]
user_email          varchar(200)    
user_privileges     int

注:フィールドは他にもありますが、この質問には関係ありません。

塗りつぶされたテーブルは次のようになります

+---------+--------------------+-----------------+
| user_id | user_email         | user_privileges |  << binary
+---------+--------------------+-----------------+
| 1       | john@example.com   | 165             |  10100101
| 2       | max@example.com    | 13              |  00001101
| 3       | trevor@example.com | 33              |  00100001
| 4       | paul@example.com   | 8               |  00001000
| 5       | rashid@example.com | 5               |  00000101
+---------+--------------------+-----------------+

user_privilegesここで、特定の特権ビットマスク (列ごと)でユーザーを選択したいと考えています。

例えば:

  • bitmask=1 [00000001] は、ユーザー ID 1、2、3、および 5を選択します
  • bitmask=9 [00001001] は user-id 2のみを選択します
  • bitmask=5 [00000101] は、ユーザー ID 1、2、および 5を選択します
  • bitmask =130 [10000010] はnoneを選択します

私の質問:クエリから可能ですか、それともすべてのユーザーを 1 人ずつ調べて PHP コードからこの値を確認する必要がありますか? また、フィールドuser_privilegestext整数ではなく 16 進数を含む場合は可能ですか? mysqlクエリの例が必要です。

注:これは、8 ビットの特権セットを使用した単純な例です。実際の環境では、より大きなセット (より大きな整数、より多くのバイト) を持つ場合があります。権限の状態ごとに個別の列を作成することは問題なく機能しますが、それは可能な解決策ではありません。私はむしろ16進値で作業したいのですが、整数も問題ありません。何かが何もないよりはましです。

事前にサンクス。

4

2 に答える 2

15
SELECT
    *
FROM
    users
WHERE
    (user_privileges & <level>) = <level>

<level>検索するアクセスレベルです (例: 1、5、9、130 など)。

于 2012-06-15T23:37:44.903 に答える
15

[...] いくつかのフィールドを選択したい

違う。いくつかのRowsを選択したいとします。列は通常、フィールドと呼ばれます。

ドキュメンテーションを読むことになっています: Bit Functions are documented for mysql.

だからあなたは試すことができます:

Select * from users WHERE (user_privileges & 1) >0

于 2012-06-15T23:23:28.480 に答える