多个LIKE的Mysql分类

时间:2013-08-10 17:33:58

标签: mysql sql-like

关于分拣的主题很多(例如:Order Results By Occurrence),但这些都是一个值。

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

1个字:

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

2个字:

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

等...

我想要做的是对找到最多的关键字进行排序。我如何处理未知数量的keywords LIKE's

1 个答案:

答案 0 :(得分: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