当可能存在完全匹配时,对 MySQL table 执行部分搜索
Perform partial search on MySQL table when exact match may be available
我是 运行 来自 PHP 脚本的以下 SQL 语句:
SELECT PHONE, COALESCE(PREFERREDNAME, POPULARNAME) FROM distilled_contacts WHERE PHONE LIKE :phone LIMIT 6
很明显,语句 return 的前 6 个与所讨论的 table 相匹配。我绑定到 :phone
变量的值是这样的:
$search = '%'.$search.'%';
其中,$search
可以是任意一串数字。通配符确保搜索 918
时 return 每个 PHONE
字段包含 918
:
的记录
- 9180078961
- 9879189872
- 0098976918
- 918
- ...
我的问题是,如果确实存在一个条目,其值与搜索字符串完全匹配,在本例中为 918
(上面列表中的第 4 项)。由于存在 LIMIT 6
,因此只会检索前 6 个条目,这些条目可能包含也可能不包含完全匹配的条目。有没有办法确保结果始终包含完全匹配的记录,在结果列表的顶部,应该有一个可用吗?
您可以使用 order by 来确保完全匹配总是在最前面:
ORDER BY CASE WHEN PHONE = :phone THEN 1 ELSE 2 END
使用$search = ''.$search.'%'
将显示与起始值匹配的结果。
我是 运行 来自 PHP 脚本的以下 SQL 语句:
SELECT PHONE, COALESCE(PREFERREDNAME, POPULARNAME) FROM distilled_contacts WHERE PHONE LIKE :phone LIMIT 6
很明显,语句 return 的前 6 个与所讨论的 table 相匹配。我绑定到 :phone
变量的值是这样的:
$search = '%'.$search.'%';
其中,$search
可以是任意一串数字。通配符确保搜索 918
时 return 每个 PHONE
字段包含 918
:
- 9180078961
- 9879189872
- 0098976918
- 918
- ...
我的问题是,如果确实存在一个条目,其值与搜索字符串完全匹配,在本例中为 918
(上面列表中的第 4 项)。由于存在 LIMIT 6
,因此只会检索前 6 个条目,这些条目可能包含也可能不包含完全匹配的条目。有没有办法确保结果始终包含完全匹配的记录,在结果列表的顶部,应该有一个可用吗?
您可以使用 order by 来确保完全匹配总是在最前面:
ORDER BY CASE WHEN PHONE = :phone THEN 1 ELSE 2 END
使用$search = ''.$search.'%'
将显示与起始值匹配的结果。