不知道你要干嘛,但是下面是我的解決辦法
為撫州等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及撫州網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、撫州網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
首先用 SHOW TABLES 語句顯示所有的數(shù)據(jù)庫名,然后逐漸遍歷這個數(shù)組,用 SHOW COLUMNS 顯示每個表的字段。最后你用 strpos 判斷每個字段名稱是否包含你要查找的數(shù)據(jù)
SQL模糊查詢的語法為
“SELECT column FROM table WHERE column LIKE ';pattern';”。
SQL提供了四種匹配模式:
1. % 表示任意0個或多個字符。如下語句:
SELECT * FROM user WHERE name LIKE ';%三%';
將會把name為“張三”,“三腳貓”,“唐三藏”等等有“三”的全找出來;
2. _ 表示任意單個字符。語句:
SELECT * FROM user WHERE name LIKE ';_三_';
只找出“唐三藏”這樣name為三個字且中間一個字是“三”的;
SELECT * FROM user WHERE name LIKE ';三__';
只找出“三腳貓”這樣name為三個字且第一個字是“三”的;
3. [ ] 表示括號內(nèi)所列字符中的一個(類似與正則表達式)。語句:
SELECT * FROM user WHERE name LIKE ';[張李王]三';
將找出“張三”、“李三”、“王三”(而不是“張李王三”);
如 [ ] 內(nèi)有一系列字符(01234、abcde之類的)則可略寫為“0-4”、“a-e”
SELECT * FROM user WHERE name LIKE ';老[1-9]';
將找出“老1”、“老2”、……、“老9”;
如要找“-”字符請將其放在首位:';張三[-1-9]';
4. [^ ] 表示不在括號所列之內(nèi)的單個字符。語句:
SELECT * FROM user WHERE name LIKE ';[^張李王]三';
將找出不姓“張”、“李”、“王”的“趙三”、“孫三”等;
SELECT * FROM user WHERE name LIKE ';老[^1-4]';
將排除“老1”到“老4”尋找“老5”、“老6”、……、“老9”。
!最后是重點!
由于通配符的緣故,導(dǎo)致我們查詢特殊字符“%”、“_”、“[”、“';”的語句無法正常實現(xiàn),而把特殊字符用“[ ]”括起便可正常查詢。據(jù)此我們寫出以下函數(shù):
function sqlencode(str)
str=replace(str,"';","';';")
str=replace(str,"[","[[]") ';此句一定要在最先
str=replace(str,"_","[_]")
str=replace(str,"%","[%]")
sqlencode=str
end function
1、如果你什么也沒有輸入的話,sql語句就如下:
select * from tablename where name like '%%';
這樣的話就是 name 等于任何字符都會被查出,當然所有內(nèi)容都會出來了。
2、這不是問題,從查詢的設(shè)計角度看,什么都不輸入自然是要匹配所有數(shù)據(jù),相反輸入了東西就是匹配它了。
*****************
補充:
*****************
如果你想什么都不輸入的時候什么也不返回的話方法如下:
在后臺寫兩個sql,類似如下
if ($name == ""){
$exec="select * from tablename where 1=2";
}else{
$exec="select * from tablename where name like '%$name%'";
}
---
以上,希望對你有所幫助。
mysql 中一般使用like 來進行模糊查詢,但like 的效率非常的低,容易導(dǎo)致全表掃描,因此不推薦使用。
那有木有其他的方法代替like來進行模糊查詢呢?
替代方法肯定是有的,以下是幾個可替代like 進行模糊查詢的 關(guān)鍵詞
instr
locate
position
find_in_set
下面簡單介紹下各個方法的使用情況
測試對象content 表
SELECT COUNT(mlzm_content.id) FROM mlzm_content
數(shù)據(jù)量: 33034 條信息
LIKE
SELECT id,Title from mlzm_content WHERE Title LIKE '%美女%'
結(jié)果:294 條記錄
耗時: 0.0130 秒
SELECT id,Title from mlzm_content WHERE Title LIKE '%模特%'
結(jié)果:10 條記錄
耗時: 0.0550 秒
結(jié)論:但查詢到結(jié)果集的數(shù)據(jù)量少的時候like耗時會增加,即總數(shù)據(jù)量不變,結(jié)果越少耗時約大
INSTR
語法:INSTR(str, substr)
SELECT id,title from mlzm_content WHERE INSTR(Title,'美女')0;
結(jié)果:294 條
耗時:0.0150 秒
INSTR(str, substr) 與LOCATE(substr, str) 類似,只是參數(shù)的位置變了
LOCATE
語法:LOCATE(substr, str)
SELECT id,title from mlzm_content WHERE LOCATE('美女',Title)0;
結(jié)果:294 條
耗時: 0.0150 秒
SELECT id,title from mlzm_content WHERE LOCATE('模特',Title)0
結(jié)果:10條
耗時: 0.0760 秒
下面兩種情況:
1.返回值:由全體出入?yún)?shù)合并在一起而得到的字符串。只要輸入的參數(shù)中有NULL值,就返回NULL。CONCAT允許只有一個輸入?yún)?shù)的情況。
因此,MySQL單表多字段模糊查詢可以通過下面這個SQL查詢實現(xiàn)
SELECT * FROM `magazine` WHERE CONCAT(`title`,`tag`,`description`) LIKE ‘%關(guān)鍵字%’
2.如果這三個字段中有值為NULL,則返回的也是NULL,那么這一條記錄可能就會被錯過,怎么處理呢,我這邊使用的是IFNULL進行判斷,則sql改為:
pre name="code" class="sql"SELECT * FROM `magazine` WHERE CONCAT(IFNULL(`title`,''),IFNULL(`tag`,''),IFNULL(`description`,'')) LIKE ‘%關(guān)鍵字%’