通过每行多个字段中的字符串出现次数对结果进行排序

时间:2013-02-17 13:08:51

标签: mysql sql

我正在尝试在MySQL数据库上创建(某种)全文搜索:我想在2个字段TITLEDESCRIPTION中找到字符串'abc'的出现位置按出现次数(每行)对结果进行排序,最好是加权,即TITLE中找到的每个'abc'计算DESCRIPTION中匹配值的2倍。

这在一个(可能是长而丑)的查询中是否可行?或者我是否必须创建一些单词索引表?

到目前为止,我的方法发现了事件,但没有排序,而是单独的重量。 (我在PHP中使用后者,但这开始变得非常昂贵):

SELECT * FROM CONTENT WHERE (`TITLE` like '%abc%' OR DESCRIPTION like '%abc')

2 个答案:

答案 0 :(得分:2)

尝试:

SELECT 2*(LENGTH(`TITLE`)-LENGTH(REPLACE(`TITLE`,'abc',''))) + 
         (LENGTH(DESCRIPTION)-LENGTH(REPLACE(DESCRIPTION,'abc',''))) sort_num,
       c.* FROM CONTENT c
WHERE (`TITLE` like '%abc%' OR DESCRIPTION like '%abc')
ORDER BY 1 DESC

答案 1 :(得分:2)

您可以使用replace缩短字符串的搜索次数。这样,您就可以计算列中字符串的出现次数。您可以在每个出现次数之前加上一个因子来增加其重量。此示例计算col1两次:

select  *
,       (
          2 * (char_length(col1) - char_length(replace(col1,'abc',''))) +
          (char_length(col2) - char_length(replace(col2,'abc','')))
        ) / char_length('abc') as Occurances
from    YourTable
order by
        Occurances desc

Live example at SQL Fiddle.