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 | john@example.com | 165 | 10100101 | 2 | max@example.com | 13 | 00001101 | 3 | trevor@example.com | 33 | 00100001 | 4 | paul@example.com | 8 | 00001000 | 5 | rashid@example.com | 5 | 00000101 +---------+--------------------+-----------------+ 

Теперь я хочу, чтобы пользователи SELECT определяли user_privileges определенных прав (по столбцу user_privileges ).

Например:

  • bitmask = 1 [00000001] будет выбирать идентификаторы пользователя 1, 2, 3 и 5
  • bitmask = 9 [00001001] будет выбирать только идентификатор пользователя 2
  • bitmask = 5 [00000101] будет выбирать идентификаторы пользователя 1, 2 и 5
  • bitmask = 130 [10000010] не будет выбирать ни одного

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

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

Thanx заранее.

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

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

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

Поэтому вы можете попробовать:

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

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

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