php 數(shù)據(jù)庫(kù)字段復(fù)用的基本原理與示例
更新時(shí)間:2011年07月22日 23:26:47 作者:
php 數(shù)據(jù)庫(kù)字段復(fù)用的基本原理與示例,需要的朋友可以參考下。
一、邏輯代數(shù)基礎(chǔ):
1,數(shù)字用二進(jìn)制表示,所有可能出現(xiàn)的數(shù)只有0和1兩個(gè)。
2,基本運(yùn)算只有“與”、“或”、“非”三種。
與運(yùn)算定義為:(用 & 表示與運(yùn)算)
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
可以簡(jiǎn)單理解為:只要有一個(gè)0,結(jié)果就是0,和乘法類似。
或運(yùn)算定義為:(用 表示與運(yùn)算)
0 0 = 0
0 1 = 1
1 0 = 1
1 1 = 1
可以簡(jiǎn)單理解為:只要有一個(gè)1,結(jié)果就是1,和加法類似。
二、邏輯運(yùn)算示例:
01111010101010101111111111111111 & 1100000 = 1100000
一般可以理解為:
如果要獲取一個(gè)數(shù)字某N位的數(shù)值,只需要將這個(gè)數(shù)字與2的N-1次方(掩碼)進(jìn)行與運(yùn)算即可。
三、數(shù)據(jù)庫(kù)字段定義:
以數(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ù),為了盡可能的存儲(chǔ)多個(gè)屬性,我們將其進(jìn)行如下定義:
以下所有“位”的描述順序按照從低到高(從右到左)順序表示。
0-2位表示用戶注冊(cè)狀態(tài):
000 表示新注冊(cè)未被批準(zhǔn)
001 表示注冊(cè)被批準(zhǔn)
010 表示位高級(jí)用戶
011 表示管理員
100 表示超級(jí)管理員
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';
如果我們要查詢所有 非 新注冊(cè)未被批準(zhǔn)用戶 則:
select * from binary_sample where status & b'111' != b'000';
四,使用PHP程序進(jìn)行此類計(jì)算:
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}";
如果我們要查詢所有 非 新注冊(cè)未被批準(zhǔn)用戶 則:
$status = USER_NEW;
$mask = USER_MASK;
$sql="select * from binary_sample where status & ${mask} != ${status}";
依此類推,只要定義好每個(gè)值的含義,查詢基本上就定了。
1,數(shù)字用二進(jìn)制表示,所有可能出現(xiàn)的數(shù)只有0和1兩個(gè)。
2,基本運(yùn)算只有“與”、“或”、“非”三種。
與運(yùn)算定義為:(用 & 表示與運(yùn)算)
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
可以簡(jiǎn)單理解為:只要有一個(gè)0,結(jié)果就是0,和乘法類似。
或運(yùn)算定義為:(用 表示與運(yùn)算)
0 0 = 0
0 1 = 1
1 0 = 1
1 1 = 1
可以簡(jiǎn)單理解為:只要有一個(gè)1,結(jié)果就是1,和加法類似。
二、邏輯運(yùn)算示例:
01111010101010101111111111111111 & 1100000 = 1100000
一般可以理解為:
如果要獲取一個(gè)數(shù)字某N位的數(shù)值,只需要將這個(gè)數(shù)字與2的N-1次方(掩碼)進(jìn)行與運(yùn)算即可。
三、數(shù)據(jù)庫(kù)字段定義:
以數(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ù),為了盡可能的存儲(chǔ)多個(gè)屬性,我們將其進(jìn)行如下定義:
以下所有“位”的描述順序按照從低到高(從右到左)順序表示。
0-2位表示用戶注冊(cè)狀態(tài):
000 表示新注冊(cè)未被批準(zhǔn)
001 表示注冊(cè)被批準(zhǔn)
010 表示位高級(jí)用戶
011 表示管理員
100 表示超級(jí)管理員
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';
如果我們要查詢所有 非 新注冊(cè)未被批準(zhǔn)用戶 則:
select * from binary_sample where status & b'111' != b'000';
四,使用PHP程序進(jìn)行此類計(jì)算:
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}";
如果我們要查詢所有 非 新注冊(cè)未被批準(zhǔn)用戶 則:
$status = USER_NEW;
$mask = USER_MASK;
$sql="select * from binary_sample where status & ${mask} != ${status}";
依此類推,只要定義好每個(gè)值的含義,查詢基本上就定了。
您可能感興趣的文章:
- php使用sql數(shù)據(jù)庫(kù) 獲取字段問(wèn)題介紹
- PHP以指定字段為索引返回?cái)?shù)據(jù)庫(kù)所取的數(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里的字段自動(dòng)生成類文件的)
- php判斷輸入不超過(guò)mysql的varchar字段的長(zhǎng)度范圍
- mysql下創(chuàng)建字段并設(shè)置主鍵的php代碼
- PHP中查詢SQL Server或Sybase時(shí)TEXT字段被截?cái)嗟慕鉀Q方法
- php獲取字段名示例分享
相關(guān)文章
setcookie中Cannot modify header information-headers already s
本篇對(duì)setcookie中Cannot modify header information-headers already sent by錯(cuò)誤的解決方法進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下2013-05-05
dede3.1分頁(yè)文字采集過(guò)濾規(guī)則詳說(shuō)(圖文教程)續(xù)四
dede3.1分頁(yè)文字采集過(guò)濾規(guī)則詳說(shuō)(圖文教程)續(xù)四...2007-04-04
php偽協(xié)議實(shí)現(xiàn)命令執(zhí)行詳情
這篇文章主要介紹了php偽協(xié)議實(shí)現(xiàn)命令執(zhí)行詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,感興趣的朋友可以參考一下2022-06-06
PHP使用curl函數(shù)發(fā)送Post請(qǐng)求的注意事項(xiàng)
這篇文章主要給大家介紹的是PHP使用curl函數(shù)發(fā)送Post請(qǐng)求的一些注意事項(xiàng),文中通過(guò)示例代碼與解釋介紹的很詳細(xì),對(duì)大家學(xué)習(xí)或則使用PHP具有一定的參考借鑒價(jià)值,有需要的朋友們可以跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。2016-11-11
php開(kāi)發(fā)過(guò)程中關(guān)于繼承的使用方法分享
通常需要這樣一些類,這些類與其它現(xiàn)有的類擁有相同變量和函數(shù)。實(shí)際上,定義一個(gè)通用類用于所有的項(xiàng)目,并且不斷豐富這個(gè)類以適應(yīng)每個(gè)具體項(xiàng)目將是一個(gè)不 錯(cuò)的練習(xí)。2011-06-06
實(shí)現(xiàn)php刪除鏈表中重復(fù)的結(jié)點(diǎn)
在本篇文章中,我們給大家?guī)?lái)了關(guān)于php刪除鏈表中重復(fù)的結(jié)點(diǎn)的相關(guān)知識(shí)點(diǎn)內(nèi)容以及相關(guān)代碼,有興趣的朋友們參考下。2018-09-09

