关于分拣的主题很多(例如: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
答案 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