按最佳匹配顺序排列mysql结果

时间:2018-06-24 00:15:07

标签: 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

和具有以下结果的表。

[id] |  [table_string]
-------------------------------
 1   |  this is a test result 
 2   |  and another one here 
 3   |  plus one more for test purposes

我将如何像这样生成结果订单?...

1 - **this** **is** a **test** result [BEST MATCH]
2 - plus one more for **test** purposes [SLIGHT MATCH]
3 - and another one here [NO MATCH]

希望这很有道理。

谢谢。

编辑:** **仅用于强调匹配的单词,实际上并不一定要像这样出现。

1 个答案:

答案 0 :(得分:1)

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

SELECT *, CASE
WHEN table_string LIKE '%this%' THEN 1
WHEN table_string LIKE '%is%' THEN 2
WHEN table_string LIKE '%test%' THEN 3
ELSE 4
END AS OrderRank FROM table WHERE table_string RLIKE '.*(this|is|test).*'
ORDER BY OrderRank ASC

这使用您在每个“ when”子句中指定的条件来创建一个额外的列,然后您可以根据自己的偏好对其进行排序,因为数据库本身不知道“最佳”匹配的含义。

但是,这在数据库中并不是很有效。您应该在应用程序中真正做到这一点,因为这种事情的查询计划将涉及临时表,这最终会导致效率低下 尤其是对于大型数据集。