2012-06-15 37 views
14

Tôi có bảng người dùng và muốn CHỌN một số hàng theo tiêu chí bitmask. Tôi sẽ cố gắng giải thích vấn đề của tôi với ví dụ nhỏ.CHỌN người dùng từ cơ sở dữ liệu MySQL bằng đặc quyền bitmask?

Cấu trúc của bảng người dùng

user_id    int   [primary key, auto_increment] 
user_email   varchar(200)  
user_privileges  int 

Lưu ý: Nó có nhiều lĩnh vực nhưng chúng không thích hợp cho câu hỏi này.

bảng Đầy có thể trông như thế này

+---------+--------------------+-----------------+ 
| 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 
+---------+--------------------+-----------------+ 

Bây giờ tôi muốn chọn người dùng bởi đặc quyền bitmask cụ thể (bằng cách user_privileges cột).

Ví dụ:

  • bitmask = 1 [00000001] sẽ chọn sử dụng id 1, 2, 3 và 5
  • bitmask = 9 [00.001.001] sẽ chọn user- id chỉ
  • bitmask = 5 [00.000.101] sẽ chọn sử dụng id 1, 2 và 5
  • bitmask = 130 [10.000.010] sẽ chọn none

Câu hỏi của tôi: Có thể từ truy vấn hoặc tôi phải đi tất cả người dùng một-by-one và kiểm tra giá trị này từ Mã PHP? Ngoài ra, có thể nếu trường user_privilegestext, chứa số thập lục phân, thay vì số nguyên? Tôi cần làm việc ví dụ truy vấn mysql.

Lưu ý: Đây chỉ là một ví dụ đơn giản với bộ đặc quyền 8 bit. Trong môi trường thực, nó có thể có các tập lớn hơn (số nguyên lớn hơn, nhiều byte hơn). Tạo cột riêng cho mỗi trạng thái đặc quyền hoạt động tốt, nhưng đó không phải là giải pháp khả thi. Tôi muốn làm việc với các giá trị hex, nhưng số nguyên cũng tốt, một cái gì đó là tốt hơn so với không có gì.

Thanx trước.

Trả lời

8

[...] muốn chọn một số lĩnh vực

sai. Bạn muốn chọn một số Hàng. Các cột thường được gọi là các trường.

Bạn có nghĩa vụ phải đọc Tài liệu: Bit Functions được ghi lại cho mysql.

Vì vậy, bạn có thể thử:

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

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

<level> là cấp độ truy cập bạn muốn tìm kiếm trên (ví dụ 1, 5, 9, 130, vv)

+0

I don' t xem làm thế nào điều này sẽ làm việc. Có thể có nhiều đặc quyền hơn mức, trong trường hợp đó sự bình đẳng của bạn sẽ thất bại, nhưng đó không phải là kết quả mong muốn. Ví dụ như được nêu rõ. (10100101 & 00000001)! = 00000001 nhưng đó là kết quả mong muốn. – Hrishikesh

+0

Hmm ... Tôi không chắc liệu tôi có hiểu đầy đủ hay không. Tôi có thể thiếu một cái gì đó hoàn toàn như tôi khá mới để bitwise, nhưng truy vấn của tôi chọn tất cả các hàng thích hợp dựa trên ví dụ OPs ... vì vậy những gì tôi không nhận được? –

+3

@Hrishikesh: '10100101 & 00000001' bằng '00000001'. Đó là một bitwise và, vì vậy đối với mỗi bitpair nơi cả hai là '1', bạn sẽ có được' 1' trở lại. Đó là một bitwise 'AND'. [xem ví dụ máy tính này] (http://www.miniwebtool.com/bitwise-calculator/?data_type=10&number1=10100101&number2=00000001&operator=AND) – Nanne

Các vấn đề liên quan