mysql 喜欢匹配字符串上的完整单词或单词开头

Pao*_*olo 5 mysql sql-like

给定一个搜索字符串,我需要选择每条记录(在执行搜索的字段中)至少有一个以给定文本开头的单词。

例如:

'John Doe'
Run Code Online (Sandbox Code Playgroud)

必须使用搜索字符串进行选择,例如:

'joh'
'do'
'JOHN doe'
Run Code Online (Sandbox Code Playgroud)

不必选择

'ohn'
'oe'
Run Code Online (Sandbox Code Playgroud)

我需要(可能)避免全文搜索。

我发现有效的是

$query = 'SELECT * FROM MYTABLE WHERE SEARCHFIELD LIKE "' . $searchText . '%"'
                                . 'OR SEARCHFIELD LIKE "% ' . $searchText . '%"'
Run Code Online (Sandbox Code Playgroud)

我想问是否有更好的方法来做到这一点。

(对于“更好的方式”,我的意思是更好的性能相同的性能但更优雅

另外,由于查询将使用准备好的语句构建,因此我应该如何对搜索字符串中的LIKE元字符进行转义?

Pao*_*olo 3

正如问题中已经指出的查询

$query = 'SELECT * FROM MYTABLE WHERE SEARCHFIELD LIKE "' . $searchText . '%"'
                                . 'OR SEARCHFIELD LIKE "% ' . $searchText . '%"'
Run Code Online (Sandbox Code Playgroud)

适用于匹配SEARCHFIELD包含以(或等于)开头的单词的记录$searchText


关于性能我在我的开发机器上做了测试MBP 2,2 GHz i7 quad core

在 4000 条记录中搜索一个单词大约需要 40 毫秒。

记录通常被索引(无全文)。

我有几千条记录,并且查询不经常运行,所以对我来说很好。
该解决方案可能不适合其他情况。


为了使用上述查询构建准备好的语句,我使用了此处描述的技术:

转义 MySQL 通配符

结果代码如下:

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 );

/* ... */
Run Code Online (Sandbox Code Playgroud)