У меня есть таблица пользователей и вы хотите выбрать несколько строк по битовым критериям. Я попытаюсь объяснить свою проблему небольшим примером.
Структура пользователей таблицы
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
).
Например:
Мой вопрос: возможно ли это из запроса или я должен отправлять всех пользователей один за другим и проверять это значение из кода 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 и т. д.).