按最佳匹配排序mysql结果

按最佳匹配排序mysql结果,mysql,Mysql,好吧,想象一下这个mysql查询 SELECT * FROM table WHERE table_string RLIKE '[[:<:]]this[[:>:]]' OR table_string RLIKE '[[:<:]]is[[:>:]]' OR table_string RLIKE '[[:<:]]test[[:>:]]' ORDER BY best_match DESC 我怎样才能做出这样的订单呢 1 - **this** **is** a **

好吧,想象一下这个mysql查询

SELECT * FROM table WHERE table_string RLIKE '[[:<:]]this[[:>:]]' OR
table_string RLIKE '[[:<:]]is[[:>:]]' OR 
table_string RLIKE '[[:<:]]test[[:>:]]' ORDER BY best_match DESC
我怎样才能做出这样的订单呢

1 - **this** **is** a **test** result [BEST MATCH]
2 - plus one more for **test** purposes [SLIGHT MATCH]
3 - and another one here [NO MATCH]
希望这是有意义的

谢谢


编辑:****只是用来强调匹配的单词,它实际上不必这样显示。

有很多方法可以做到这一点。 如果只想在数据库中执行此操作,可以使用CASE子句,如下所示:

SELECT*,大小写
当表_包含“%this%”这样的字符串时,则为1
当像“%1”这样的表字符串为%时,则为2
当表\u字符串像“%test%”时,则为3
其他4
从表中以OrderRank结束,其中表|字符串类似“.*”(此|为|测试)。*'
按OrderRank ASC排序
这使用了您在每个“when”子句中指定的条件来创建一个额外的列,然后您可以根据您的首选项对该列进行排序,因为数据库本身不知道您所说的“最佳”匹配是什么意思

但是,这在数据库中不是有效的。您真的应该在应用程序中这样做,因为这类事情的查询计划将涉及临时表,这将导致非常低效的结果
诸如此类,尤其是对于大型数据集。

只是好奇而已。我假设它们是正则表达式,但什么是
[[:它们是边界标记,显示从何处开始和停止与正则表达式匹配,因此基本上任何包含
this
is
,或
test
,的列值都将匹配?是的,作为完整单词,没有部分单词等。在这种情况下,您应该使用常规的“LIKE”子句或修改WHERE子句以使用单个正则表达式来减少表扫描的数量,因为这至少需要对每个标记的table_字符串列进行索引扫描,除非它将其优化为一个临时表和一个连接,您必须对其进行测试以确认。我将修改我的答案以显示这一点去掉了实际的CASE关键字。修复了。所以你是说为了效率,我最好让mysql进行匹配,并使用PHP来改变它的显示方式?是的。对于这种更复杂的排序,肯定是这样。数据库在计算要获取的数据方面非常有效,而应用程序在每一个方面都能够更加高效另外,考虑一个Web农场场景。如果你有一个以上的Web服务器,排序逻辑所施加的额外负载可以水平分布。如果你在数据库中这样做,你最终会破坏整个DB服务器的性能,而没有得到好的收益。是的,我明白你的意思。谢谢你的建议和信息。
1 - **this** **is** a **test** result [BEST MATCH]
2 - plus one more for **test** purposes [SLIGHT MATCH]
3 - and another one here [NO MATCH]