У меня есть таблица users и хочу, чтобы SELECT несколько строк по критериям битмаски. Я попытаюсь объяснить свою проблему небольшим примером.
Структура таблицы пользователей
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
- bitmask = 9 [00001001] будет выбирать только идентификатор пользователя 2
- битмаска = 5 [00000101] будет выбирать идентификаторы пользователя 1, 2 и 5
- битмаска = 130 [10000010] выберет none
Мой вопрос: Возможно ли это из запроса или мне нужно отправлять всех пользователей один за другим и проверить это значение из кода PHP? Кроме того, возможно ли, что поле user_privileges text
, содержащее шестнадцатеричные числа, вместо целых чисел? Мне нужен рабочий пример запроса mysql.
Примечание. Это простой пример с 8-разрядным набором привилегий. В реальной среде он может иметь более крупные наборы (большие целые числа, больше байтов). Создание отдельного столбца для каждого состояния привилегий работает отлично, но это невозможно. Я предпочел бы работать с шестнадцатеричными значениями, но целые числа тоже прекрасны, что-то лучше, чем ничего.
Thanx заранее.