php 數據庫字段復用的基本原理與示例
2024-05-04 23:17:39
供稿:網友
 
一、邏輯代數基礎: 
  1,數字用二進制表示,所有可能出現的數只有0和1兩個。 
  2,基本運算只有“與”、“或”、“非”三種。 
  與運算定義為:(用 & 表示與運算) 
  0 & 0 = 0 
  0 & 1 = 0 
  1 & 0 = 0 
  1 & 1 = 1 
  可以簡單理解為:只要有一個0,結果就是0,和乘法類似。 
  或運算定義為:(用 表示與運算) 
  0 0 = 0 
  0 1 = 1 
  1 0 = 1 
  1 1 = 1 
  可以簡單理解為:只要有一個1,結果就是1,和加法類似。 
  二、邏輯運算示例: 
  01111010101010101111111111111111 & 1100000 = 1100000 
  一般可以理解為: 
  如果要獲取一個數字某N位的數值,只需要將這個數字與2的N-1次方(掩碼)進行與運算即可。 
  三、數據庫字段定義: 
  以數據表 binary_sample為例: 
  create table binary_sample( 
  uid int unsigned not null, 
  status int unsigned not null default 0, 
  primary key(uid), 
  key i_s(status) 
  )engine=innodb; 
  status字段定義: 
  status字段數據類型為32bit的整數,為了盡可能的存儲多個屬性,我們將其進行如下定義: 
  以下所有“位”的描述順序按照從低到高(從右到左)順序表示。 
  0-2位表示用戶注冊狀態: 
  000 表示新注冊未被批準 
  001 表示注冊被批準 
  010 表示位高級用戶 
  011 表示管理員 
  100 表示超級管理員 
  101 保留 
  110 保留 
  111 掩碼 
  3-5位用戶性別: 
  000 表示性別不確定 
  001 表示性別為男 
  010 表示性別為女 
  011 保留 
  100 保留 
  101 保留 
  110 保留 
  111 掩碼 
  如果我們要查詢所有 男用戶 則: 
  select * from binary_sample where status & b'111000' = b'001000'; 
  如果我們要查詢所有 管理員用戶 則: 
  select * from binary_sample where status & b'111' = b'011'; 
  如果我們要查詢所有 男管理員用戶 則: 
  select * from binary_sample where status & b'111111' = b'001011'; 
  如果我們要查詢所有 非 新注冊未被批準用戶 則: 
  select * from binary_sample where status & b'111' != b'000'; 
  四,使用PHP程序進行此類計算: 
  define("USER_NEW",0);//000 
  define("USER_NORMAL",1);//001 
  define("USER_ADVANCE",2);//010 
  define("USER_MANAGE",3);//011 
  define("USER_SUPER",4);//100 
  define("USER_MASK",7);//111 
  define("GENDER_UNKNOWN",0);// 000000 
  define("GENDER_MALE",8);// 001000 
  define("GENDER_FEMALE",9);// 010000 
  define("GENDER_MASK",56);// 111000 
  如果我們要查詢所有 男用戶 則: 
  $status=GENDER_MALE; 
  $mask=GENDER_MASK; 
  $sql="select * from binary_sample where status & ${mask}' = ${status}"; 
  如果我們要查詢所有 管理員用戶 則: 
  $status=USER_MANAGE; 
  $mask=USER_MASK; 
  $sql="select * from binary_sample where status & ${mask}' = ${status}"; 
  如果我們要查詢所有 男管理員用戶 則: 
  $status=GENDER_MALE & USER_MANAGE; 
  $mask = GENDER_MASK & GENDER_MASK; 
  $sql="select * from binary_sample where status & ${mask}' = ${status}"; 
  如果我們要查詢所有 非 新注冊未被批準用戶 則: 
  $status = USER_NEW; 
  $mask = USER_MASK; 
  $sql="select * from binary_sample where status & ${mask} != ${status}"; 
  依此類推,只要定義好每個值的含義,查詢基本上就定了。