SELECT пользователей из базы данных MySQL с помощью привилегий bitmask? - программирование
Подтвердить что ты не робот

SELECT пользователей из базы данных MySQL с помощью привилегий bitmask?

У меня есть таблица 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 заранее.

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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