![](/img/trans.png)
[英]How to perform a case in-sensitive search on a case sensitive MySQL database?
[英]Search exact word on database (none case sensitive)
我有這個查詢,我用它來獲取指定記錄的位置。
$sq = "SELECT COUNT(*)
FROM items LEFT JOIN info ON items.refID = info.refID
WHERE info.description = :status AND items.itmName < :itm
ORDER BY items.itmName";
$stmt = $connect->prepare($sq);
$stmt->execute(array(':status'=>"inStock", ':itm'=>$itm));
$rslt = $stmt->fetch(PDO::FETCH_NUM);
$pos = $rslt[0]+1;
問題(舉個例子):
$itm = "Mango"
我在我的數據庫中有一個名為Mango
的項目然后當我進行搜索時它返回Mango
的正確位置為321 //正常工作
$itm = "Mangox"
如果我鍵入Mangox
並進行搜索(Mangox不存在),它仍然會返回321的位置。
如何使搜索詞與數據庫中的確切項匹配(但不區分大小寫)?
問題是,要獲得“位置”,您要計算的所有名稱都小於您要查找的名稱。
因此,無論您搜索什么,只要名稱小於0,它就會返回大於0的數字。
例如, $itm = "ZZZ"
可能會讓您獲得表格中的最后位置。
另一個問題是你以后做的事情:
$pos = $rslt[0]+1;
因此,即使查詢返回0
,您仍然會將其視為位置編號1。
從另一個問題中獲取的一種可能性(我沒有運行它,因此它可能有一些語法問題,但一般的想法可能有效):
SELECT rank
FROM (
SELECT @rn:=@rn+1 AS rank, itmName
FROM (
SELECT items.itmName
FROM items LEFT JOIN info ON items.refID = info.refID
WHERE info.description = :status AND items.itmName <= :itm
ORDER BY items.itmName
) t1, (SELECT @rn:=0) t2
)
WHERE itmName = :itm
在任何情況下,您都需要處理這樣一個事實,即當名稱不存在時,查詢現在不會返回任何數字。
當列表中找不到Mangox
時,您想要返回什么結果? 您是否希望查詢不返回行?
不需要ORDER BY
子句,因為查詢返回一行。 LEFT JOIN
的“外部性”由WHERE
子句中的謂詞否定。 (如果info.description = something
,這意味着info.description IS NOT NULL
,這意味着它將從info
中沒有匹配行的items
中排除任何行。因此,它實際上是一個內部聯接。)
要在items
表中不存在指定的:itm
不返回任何行 ,可以對返回零行的查詢執行連接操作。
SELECT p.pos
FROM ( SELECT COUNT(*) AS pos
FROM items
JOIN info
ON items.refID = info.refID
WHERE info.description = :status
AND items.itmName < :itm
) p
CROSS
JOIN (SELECT 1
FROM items r
WHERE r.itmName = :itm2 -- additional bind placeholder
LIMIT 1
) q
對於添加的綁定占位符,您需要第二次傳入$itm
的值。
$stmt->execute(array(':status'=>"inStock", ':itm'=>$itm, ':itm2'=>$itm));
// ^^^^^^^^^^^^^^^
如果沒有返回一行,則fetch將返回FALSE,因此在引用$rslt[0]
之前,您需要進行額外的檢查(實際上有一行)。
$rslt = $stmt->fetch(PDO::FETCH_NUM);
if (!$rslt) {
// row returned
$pos = $rslt[0]+1;
} else {
// fetch failed, no row returned
// ??? do whatever you want to do when the exact word is not matched
$pos = 0; // ???
}
編輯
即使在傳遞相同值時,不同綁定占位符名稱:itm2
的原因是在語句中多次使用相同的綁定占位符名稱(在PDO中)不能像我們預期的那樣工作,如它與其他數據庫接口有關。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.