ВЫБЕРИТЕ пользователей из базы данных MySQL по битовой маске привилегий?


У меня есть таблица пользователей, и я хочу ВЫБРАТЬ несколько строк по критериям битовой маски. Я попытаюсь объяснить свою проблему на небольшом примере.

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

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] выбрал бы идентификатор пользователя 2 только
  • битовая маска=5 [00000101] выбрал бы идентификаторы пользователей 1, 2 и 5
  • битовая маска=130 [10000010] выбрал бы нет

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

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

Заранее спасибо.

Author: Wh1T3h4Ck5, 2012-06-16

2 answers

[...] хотите ВЫБРАТЬ некоторые поля

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

Вы должны прочитать документацию: Битовые функции документированы для mysql.

Итак, вы можете попробовать:

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

 9
Author: Turbo J, 2012-06-15 23:23:28
SELECT
    *
FROM
    users
WHERE
    (user_privileges & <level>) = <level>

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

 9
Author: Zane Bien, 2012-06-15 23:53:10