在制定用于自动完成表单(jquery Axax + PHP)的查询时,我有一个关于 SQL 最佳实践的问题。
让我们假设如下:
- 我有一个包含书名的数据库
- 有些书的书名没有定冠词(“The”或“A”),例如“少年派奇幻漂流”
- 有些书的标题带有定冠词(“The”或“A”),例如“The Catcher in the Rye”
因此,用户将在开头使用“The”或简单地省略“The”来输入书名,然后在没有任何定冠词的情况下开始查询。
似乎存在三种可能的查询:
SELECT 'title' FROM 'books' WHERE 'title' LIKE '%$string'
或
SELECT 'title' FROM 'books' WHERE 'title' LIKE '$string%'
或
SELECT 'title' FROM 'books' WHERE 'title' LIKE '%$string%'
当使用第一种查询方法(% 在字符串之前)时,很难得到任何结果,因为字符串之前的通配符似乎表现错误。
当使用第二个查询时,它似乎更倾向于在标题前使用“The”进行精确匹配。因此,搜索“麦田里的守望者”的用户会找到这本书,但搜索“麦田里的守望者”的用户则找不到。
最后一个结果是最好的,因为它在字符串前后都有一个通配符。但是,它也给出了最长的自动完成列表。用户将不得不键入几个字母来缩小搜索结果的范围。
关于实现更高效查询的任何想法?或者第三个选项是最好的(因为书名中的定冠词分开是不可行的?
提前致谢
最佳答案
您可以使用正则表达式进行搜索(查询结果很快就会出现) 并且不要忘记为您的结果添加限制。
一个小例子
SELECT title FROM books WHERE title REGEXP '$string' LIMIT 20
或者你可以使用单词边界
SELECT title FROM books WHERE title REGEXP '[[:<:]]$string[[:>:]]' LIMIT 20
关于php - 自动完成 SQL 查询建议 (Ajax+PHP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15347223/