根据mysql中的相关性对结果进行排名

时间:2014-09-09 05:55:15

标签: mysql sorting

我的表格看起来像这样

id, name
 1, ccc hij
 2, bbb
 3, hsd

现在,如果我查询SELECT id, name FROM tbl WHERE name LIKE 'h%' OR '% h%';

它给了我这个输出

id, name
1, ccc hij
3, hsd

哪个是正确的,但顺序不正确。我甚至不能ORDER BY name,因为ccc hij无论如何都会在自然排序方面达到顶峰。

我有什么选项可以从顶部的用户关键字和底部的通配符匹配开始显示项目?

更新

考虑以下输入

1   ccc hij
2   hsd
3   hdb
4   haa

和建议的order by (name LIKE 'h%') DESC。我得到以下输出

2   hsd
3   hdb
4   haa
1   ccc hij

是否可以按字母顺序对'h%'个匹配进行排序?

2 个答案:

答案 0 :(得分:1)

MySQL有一个很好的功能,当布尔值被视为数字时,它被转换为1和0。因此,处理此要求的一种方法是根据列是否与通配符匹配来订购:

SELECT   id, name 
FROM     tbl 
WHERE    name LIKE 'h%' OR name LIKE '% h%'
ORDER BY (name LIKE 'h%') DESC

答案 1 :(得分:1)

首先,查看将返回相关性编号的文本引擎。 MYSQL has one,或者你可以去solr / elasticsearch / cloudsearch /等。

其次,使用前面的通配符查询无法使用索引,因此"%h%"将导致表的顺序扫描。

最后,您可以使用CASE语句执行所需操作:

SELECT id, name,
  CASE
    WHEN name like 'h%' then 100
    WHEN name like '% h%' then 5
  END as score
FROM tbl
WHERE name LIKE 'h%' OR '% h%'
ORDER BY score DESC

关于这一点的好处是你可以拥有多个复杂的得分条件(每个WHEN子句)。