簡體   English   中英

在數據庫中搜索確切的單詞(無區分大小寫)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM