ВЫБЕРИТЕ пользователей из базы данных 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-битным набором привилегий. В реальной среде он может иметь большие наборы (большие целые числа, больше байтов). Создание отдельного столбца для каждого состояния привилегий работает нормально, но это невозможно. Я бы предпочел работать с шестнадцатеричными значениями, но целые числа тоже хороши, что-то лучше, чем ничего.
Заранее спасибо.
2 answers
[...] хотите ВЫБРАТЬ некоторые поля
Неправильно. Вы хотите выбрать несколько строк . Столбцы обычно называются полями.
Вы должны прочитать документацию: Битовые функции документированы для mysql.
Итак, вы можете попробовать:
Select * from users WHERE (user_privileges & 1) >0
SELECT
*
FROM
users
WHERE
(user_privileges & <level>) = <level>
<level>
это уровень доступа, на котором вы хотите выполнить поиск (например, 1, 5, 9, 130 и т.д.)