好吧,想象一下这个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]
希望这很有道理。
谢谢。
编辑:** **仅用于强调匹配的单词,实际上并不一定要像这样出现。
答案 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”子句中指定的条件来创建一个额外的列,然后您可以根据自己的偏好对其进行排序,因为数据库本身不知道“最佳”匹配的含义。
但是,这在数据库中并不是很有效。您应该在应用程序中真正做到这一点,因为这种事情的查询计划将涉及临时表,这最终会导致效率低下 尤其是对于大型数据集。