php 數(shù)據(jù)庫字段復(fù)用的基本原理與示例
更新時間:2011年07月22日 23:26:47 作者:
php 數(shù)據(jù)庫字段復(fù)用的基本原理與示例,需要的朋友可以參考下。
一、邏輯代數(shù)基礎(chǔ):
1,數(shù)字用二進(jìn)制表示,所有可能出現(xiàn)的數(shù)只有0和1兩個。
2,基本運(yùn)算只有“與”、“或”、“非”三種。
與運(yùn)算定義為:(用 & 表示與運(yùn)算)
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
可以簡單理解為:只要有一個0,結(jié)果就是0,和乘法類似。
或運(yùn)算定義為:(用 表示與運(yùn)算)
0 0 = 0
0 1 = 1
1 0 = 1
1 1 = 1
可以簡單理解為:只要有一個1,結(jié)果就是1,和加法類似。
二、邏輯運(yùn)算示例:
01111010101010101111111111111111 & 1100000 = 1100000
一般可以理解為:
如果要獲取一個數(shù)字某N位的數(shù)值,只需要將這個數(shù)字與2的N-1次方(掩碼)進(jìn)行與運(yùn)算即可。
三、數(shù)據(jù)庫字段定義:
以數(shù)據(jù)表 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字段數(shù)據(jù)類型為32bit的整數(shù),為了盡可能的存儲多個屬性,我們將其進(jìn)行如下定義:
以下所有“位”的描述順序按照從低到高(從右到左)順序表示。
0-2位表示用戶注冊狀態(tài):
000 表示新注冊未被批準(zhǔn)
001 表示注冊被批準(zhǔn)
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';
如果我們要查詢所有 非 新注冊未被批準(zhǔn)用戶 則:
select * from binary_sample where status & b'111' != b'000';
四,使用PHP程序進(jìn)行此類計算:
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}";
如果我們要查詢所有 非 新注冊未被批準(zhǔn)用戶 則:
$status = USER_NEW;
$mask = USER_MASK;
$sql="select * from binary_sample where status & ${mask} != ${status}";
依此類推,只要定義好每個值的含義,查詢基本上就定了。
1,數(shù)字用二進(jìn)制表示,所有可能出現(xiàn)的數(shù)只有0和1兩個。
2,基本運(yùn)算只有“與”、“或”、“非”三種。
與運(yùn)算定義為:(用 & 表示與運(yùn)算)
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
可以簡單理解為:只要有一個0,結(jié)果就是0,和乘法類似。
或運(yùn)算定義為:(用 表示與運(yùn)算)
0 0 = 0
0 1 = 1
1 0 = 1
1 1 = 1
可以簡單理解為:只要有一個1,結(jié)果就是1,和加法類似。
二、邏輯運(yùn)算示例:
01111010101010101111111111111111 & 1100000 = 1100000
一般可以理解為:
如果要獲取一個數(shù)字某N位的數(shù)值,只需要將這個數(shù)字與2的N-1次方(掩碼)進(jìn)行與運(yùn)算即可。
三、數(shù)據(jù)庫字段定義:
以數(shù)據(jù)表 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字段數(shù)據(jù)類型為32bit的整數(shù),為了盡可能的存儲多個屬性,我們將其進(jìn)行如下定義:
以下所有“位”的描述順序按照從低到高(從右到左)順序表示。
0-2位表示用戶注冊狀態(tài):
000 表示新注冊未被批準(zhǔn)
001 表示注冊被批準(zhǔn)
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';
如果我們要查詢所有 非 新注冊未被批準(zhǔn)用戶 則:
select * from binary_sample where status & b'111' != b'000';
四,使用PHP程序進(jìn)行此類計算:
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}";
如果我們要查詢所有 非 新注冊未被批準(zhǔn)用戶 則:
$status = USER_NEW;
$mask = USER_MASK;
$sql="select * from binary_sample where status & ${mask} != ${status}";
依此類推,只要定義好每個值的含義,查詢基本上就定了。
您可能感興趣的文章:
- php使用sql數(shù)據(jù)庫 獲取字段問題介紹
- PHP以指定字段為索引返回數(shù)據(jù)庫所取的數(shù)據(jù)數(shù)組
- php mssql擴(kuò)展SQL查詢中文字段名解決方法
- php面向?qū)ο?字段的聲明與使用
- php中將圖片gif,jpg或mysql longblob或blob字段值轉(zhuǎn)換成16進(jìn)制字符串
- PHP FOR MYSQL 代碼生成助手(根據(jù)Mysql里的字段自動生成類文件的)
- php判斷輸入不超過mysql的varchar字段的長度范圍
- mysql下創(chuàng)建字段并設(shè)置主鍵的php代碼
- PHP中查詢SQL Server或Sybase時TEXT字段被截斷的解決方法
- php獲取字段名示例分享
相關(guān)文章
解決PHP 7編譯安裝錯誤:cannot stat ‘phar.phar’: No such file or direc
這篇文章主要給大家介紹了關(guān)于解決在PHP 7編譯安裝遇到的錯誤錯誤:cannot stat ‘phar.phar’: No such file or directory問題的相關(guān)資料,文中給出詳細(xì)的解決方法,需要的朋友可以參考借鑒。2017-02-02PHP實(shí)現(xiàn)上傳文件并存進(jìn)數(shù)據(jù)庫的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)上傳文件并存進(jìn)數(shù)據(jù)庫的方法,涉及php文件上傳所涉及的文件與表單操作及數(shù)據(jù)庫操作相關(guān)技巧,非常具有實(shí)用價值,需要的朋友可以參考下2015-07-07php下HTTP Response中的Chunked編碼實(shí)現(xiàn)方法
有時候,Web服務(wù)器生成HTTP Response是無法在Header就確定消息大小的,這時一般來說服務(wù)器將不會提供Content-Length的頭信息,而采用Chunked編碼動態(tài)的提供body內(nèi)容的長度。2008-11-11PHP中set_include_path()函數(shù)相關(guān)用法分析
這篇文章主要介紹了PHP中set_include_path()函數(shù)相關(guān)用法,結(jié)合實(shí)例形式分析了php針對文件路徑設(shè)置的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2016-07-07php+mysql開發(fā)的最簡單在線題庫(在線做題系統(tǒng))完整案例
這篇文章主要介紹了php+mysql開發(fā)的最簡單在線題庫(在線做題系統(tǒng))案例,結(jié)合完整實(shí)例形式分析了PHP結(jié)合MySQL數(shù)據(jù)庫查詢、判斷實(shí)現(xiàn)的在線題庫功能相關(guān)操作技巧,需要的朋友可以參考下2019-03-03php實(shí)現(xiàn)的雙向隊(duì)列類實(shí)例
這篇文章主要介紹了php實(shí)現(xiàn)的雙向隊(duì)列類,是數(shù)據(jù)結(jié)構(gòu)中非常重要的一個數(shù)據(jù)結(jié)構(gòu)類型,需要的朋友可以參考下2014-09-09