У меня есть таблица пользователей и вы хотите выбрать несколько строк по битовой маске. Я попытаюсь объяснить свою проблему небольшим примером.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 заранее.
Я не» Посмотрите, как это будет работать. Могут быть дополнительные привилегии, чем уровень, и в этом случае ваше равенство потерпит неудачу, но это не был желаемый результат. Например, в качестве примера приведены четко сформулированные состояния. (10100101 & 00000001)! = 00000001, но это желаемый результат. – Hrishikesh
Хм ... Я не уверен, полностью ли я понимаю. Мне может быть что-то не хватает, поскольку я довольно новичок в побитом, но мой запрос выбирает все правильные строки на основе примера OPs ... так что же я не получаю? –
@Hrishikesh: '10100101 & 00000001' равно' 00000001'. Это поразрядно, и поэтому для каждого бита, где оба являются «1», вы получаете «1» назад. Это поразрядное 'AND'. [см. этот калькулятор] (http://www.miniwebtool.com/bitwise-calculator/?data_type=10&number1=10100101&number2=00000001&operator=AND) – Nanne