2012-06-15 7 views
14

У меня есть таблица пользователей и вы хотите выбрать несколько строк по битовой маске. Я попытаюсь объяснить свою проблему небольшим примером.SELECT пользователей из базы данных MySQL с помощью привилегий bitmask?

Структура таблицы пользователи

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

Примечание: Он имеет несколько полей, но они не имеют никакого отношения к этому вопросу.

Заполненная таблица может выглядеть следующим образом

+---------+--------------------+-----------------+ 
| user_id | user_email   | user_privileges | << binary 
+---------+--------------------+-----------------+ 
| 1  | [email protected] | 165    | 10100101 
| 2  | [email protected] | 13    | 00001101 
| 3  | [email protected] | 33    | 00100001 
| 4  | [email protected] | 8    | 00001000 
| 5  | [email protected] | 5    | 00000101 
+---------+--------------------+-----------------+ 

Теперь я хочу, чтобы выбрать пользователь по конкретным привилегиям битовой маски (от user_privileges колонки).

Например:

  • битовая маска = 1 [00000001] будет выбирать пользовательские идентификаторы 1, 2, 3 и 5
  • битовая маска = 9 [00001001] будет выбирать пользователем ID только
  • битовая маска = 5 [00000101] будет выбирать идентификаторов пользователя 1, 2 и 5
  • битовая = 130 [10000010] выберет никто

Мой вопрос: Можно ли из запроса или я должен пойти всем пользователям один за другим, и проверить это значение из PHP-код? Кроме того, возможно ли, что поле user_privileges - это text, содержащий шестнадцатеричные числа, а не целые числа? Мне нужен рабочий пример запроса mysql.

Примечание: Это простой пример с 8-разрядным набором привилегий. В реальной среде он может иметь более крупные наборы (большие целые числа, больше байтов). Создание отдельного столбца для каждого состояния привилегий работает нормально, но это невозможно. Я предпочитаю работать с шестнадцатеричными значениями, но целые числа тоже хороши, что-то лучше, чем ничего.

Thanx заранее.

ответ

8

[...] хотят, чтобы выбрать несколько полей

Неправильно. Вы хотите выбрать некоторые Строки. Столбцы обычно называются полями.

Предполагается прочитать документацию: Bit Functions документированы для mysql.

Таким образом, вы можете попробовать:

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

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

<level> быть уровень доступа вы хотите найти на (например, 1, 5, 9, 130 и т.д.)

+0

Я не» Посмотрите, как это будет работать. Могут быть дополнительные привилегии, чем уровень, и в этом случае ваше равенство потерпит неудачу, но это не был желаемый результат. Например, в качестве примера приведены четко сформулированные состояния. (10100101 & 00000001)! = 00000001, но это желаемый результат. – Hrishikesh

+0

Хм ... Я не уверен, полностью ли я понимаю. Мне может быть что-то не хватает, поскольку я довольно новичок в побитом, но мой запрос выбирает все правильные строки на основе примера OPs ... так что же я не получаю? –

+3

@Hrishikesh: '10100101 & 00000001' равно' 00000001'. Это поразрядно, и поэтому для каждого бита, где оба являются «1», вы получаете «1» назад. Это поразрядное 'AND'. [см. этот калькулятор] (http://www.miniwebtool.com/bitwise-calculator/?data_type=10&number1=10100101&number2=00000001&operator=AND) – Nanne

Смежные вопросы