1

我在根据 mysql 中的字段对结果进行排序时遇到困难。比如说我正在搜索“条款”这个词,那么我应该得到首先以“条款”开头的结果,然后是“条款和”作为下一个,然后是“条款和条件”等等。

请任何人使用mysql查询以有效的方式根据我的要求帮助谁获取搜索结果。

4

4 回答 4

1
SELECT * FROM your_table WHERE your_column LIKE "Terms%" ORDER BY your_column;
于 2013-08-13T14:19:28.680 回答
0

您正在寻找全文搜索。下面是一个非常简单的例子

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*'

这个关于全文搜索的文档解释了分配。读起来很长,但值得并且完整。

于 2013-08-13T14:21:19.913 回答
0

如果您搜索前缀字符串,请不要使用全文索引!

使用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),这会有所不同。

于 2013-08-13T14:30:51.763 回答
0

根据存储引擎和 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'));
于 2013-08-13T14:26:26.997 回答