我的表格看起来像这样
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%'
个匹配进行排序?
答案 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子句)。