正如已經在質詢時所查詢
$query = 'SELECT * FROM MYTABLE WHERE SEARCHFIELD LIKE "' . $searchText . '%"'
. 'OR SEARCHFIELD LIKE "% ' . $searchText . '%"'
作品匹配的記錄,其中SEARCHFIELD
包含開頭一個字(或等於)$searchText
關於業績我我在我的開發機器上進行了測試MBP 2,2 GHz i7 quad core
:
在4.000個記錄上搜索單詞需要aro和40毫秒。
記錄通常被索引(無全文)。
我有幾千條記錄,查詢不經常運行,所以對我來說是好的。
該解決方案可能不適用於其他情況。
爲了構建與上述查詢準備語句我用這裏所描述的技術:
Escaping MySQL wild cards
將所得代碼如下:
function like($s, $e)
{
return str_replace(array($e, '_', '%'), array($e . $e, $e . '_', $e . '%'), $s);
}
/* ... */
/* create a prepared statement */
$stmt = $mysqli->prepare(
'SELECT * FROM MYTABLE WHERE SEARCHFIELD LIKE ? ESCAPE "=" OR SEARCHFIELD LIKE ? ESCAPE "="'
);
if($stmt)
{
/* escape the text */
$escSearchText = like($searchText, "=");
/* 'like' parameters */
$like1 = $escSearchText . "%";
$like2 = "%" . $escSearchText . "%";
/* bind parameters for markers */
$stmt->bind_param("ss", $like1, $like2);
/* ... */
否,將匹配'oe'或'ohn'。我會編輯我的問題以便明確表示 – Paolo
'LIKE'不能進行單詞匹配,它只是匹配字符串。 – Barmar
您需要使用'RLIKE'而不是'LIKE'並創建一個正則表達式。相同的基本方法仍然有效,您只需使用匹配單詞開頭而不是第一個'%'的正則表達式。 – Barmar