我在根据 mysql 中的字段对结果进行排序时遇到困难。比如说我正在搜索“条款”这个词,那么我应该得到首先以“条款”开头的结果,然后是“条款和”作为下一个,然后是“条款和条件”等等。
请任何人使用mysql查询以有效的方式根据我的要求帮助谁获取搜索结果。
我在根据 mysql 中的字段对结果进行排序时遇到困难。比如说我正在搜索“条款”这个词,那么我应该得到首先以“条款”开头的结果,然后是“条款和”作为下一个,然后是“条款和条件”等等。
请任何人使用mysql查询以有效的方式根据我的要求帮助谁获取搜索结果。
SELECT * FROM your_table WHERE your_column LIKE "Terms%" ORDER BY your_column;
您正在寻找全文搜索。下面是一个非常简单的例子
SELECT id,name MATCH (name) AGAINST ('string' > 'string*' IN BOOLEAN MODE) AS score
FROM tablename WHERE MATCH (name) AGAINST ('string' > 'string*' IN BOOLEAN MODE)
ORDER BY score DESC
这样做的好处是可以控制单词的值。这是非常基本的,您可以“提高”一些匹配项或单词(或“降低”它们) 在我的示例中,完全匹配 ( 'string'
) 会比带有附加内容 ( ) 的字符串获得更高的分数'string*'
。下面的行甚至更宽了一步:
'string' > 'string*' > '*string*'
这个关于全文搜索的文档解释了分配。读起来很长,但值得并且完整。
如果您搜索前缀字符串,请不要使用全文索引!
使用LIKE "Term%"
优化器将能够使用潜在的索引your_column
:
SELECT * FROM your_table
WHERE your_column LIKE "Terms%"
ORDER BY CHAR_LENGTH(your_column),your_column
注意该ORDER BY
子句:它首先按字符串长度排序,并且仅使用字母顺序对长度相等的字符串进行排序。
并且请使用CHAR_LENGTH
而不是LENGTH
第一个计算字符数,而后一个计算字节数。使用可变长度编码(例如 utf8),这会有所不同。
根据存储引擎和 mysql 版本,您可能可以使用 MySQL 的全文搜索功能。例如:
SELECT *, MATCH (your_column) AGAINST ('Terms' IN BOOLEAN MODE) AS relevance
FROM your_table
WHERE MATCH (your_column) AGAINST ('Terms' IN BOOLEAN MODE)
ORDER BY relevance
你可以在这里找到更多信息:http: //dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html
或者,如果您不想要 FTS 另一个可能的解决方案,其中排序严格基于字符串的长度(差异)。
SELECT * FROM your_table WHERE your_column LIKE "Terms%" ORDER BY ABS(LENGTH(your_column) - LENGTH('Terms'));