0

有很多关于排序的主题(例如:按出现排序结果),但这些都是为了一个价值。

我有一个人们使用关键字的搜索字段;简单地说生成的查询如下所示:

1个字:

SELECT * 
FROM  `meta` 
WHERE (`keywords` LIKE  '%bike%')

2个字:

SELECT * 
FROM  `meta` 
WHERE (
`keywords` LIKE  '%bike%'
OR  `keywords` LIKE  '%yellow%'
)

ETC...

我想做的是根据最常找到的关键字对结果进行排序。我将如何为未知数量的keywords LIKE's

4

1 回答 1

1

这是在 MySQL 中按关键字匹配数排序的一般方法(使用like):

SELECT * 
FROM `meta` 
ORDER BY ((`keywords` LIKE  '%bike%') +
          (`keywords` LIKE  '%yellow%') +
          . . .
         ) desc;

如果要处理灵活数量的关键字,则应使用适当的关系数据结构。存储keywords在单个字段中(可能以逗号分隔)不是最好的方法。您应该有一个单独的表,每个关键字一行。

编辑:

要添加找到的关键字的数量,可以将表达式放在select语句中:

SELECT m.*,
       ((`keywords` LIKE  '%bike%') +
        (`keywords` LIKE  '%yellow%') +
        . . .
       ) as NumKeywordsFound
FROM `meta` m
ORDER BY NumKeywordsFound desc;

您还可以添加一个having子句来指定至少找到一个:

SELECT m.*,
       ((`keywords` LIKE  '%bike%') +
        (`keywords` LIKE  '%yellow%') +
        . . .
       ) as NumKeywordsFound
FROM `meta` m
HAVING NumKeywordsFound > 1
ORDER BY NumKeywordsFound desc;

如果要查找在每个表达式中找到关键字的次数:

 select m.*,
        length(replace(keywords, 'bike', 'bike1')) - length(keywords) as NumBikes,
        length(replace(keywords, 'yellow', 'yellow1')) - length(keywords) as NumYellows
FROM `meta` m
于 2013-08-10T17:38:50.193 回答