我正在尝试按连续匹配的总数订购MySQL select语句。例如,如果表格看起来像......
id | dessert | choice
---------------------
1 | pie | apple pie, chocolate pie
2 | cake | chocolate cake, lemon cake, white chocolate cake, triple chocolate cake
3 | donut | frosted donut, chocolate donut, chocolate cream donut
...如果有人搜索chocolate
,则应该订购结果:
dessert | matches
-----------------
cake | 3
donut | 2
pie | 1
但是,我正在努力使这样的查询排序。我在这里看了其他的例子,但是我认为它们看起来相当简单,它们看起来过于复杂。
有没有直接的方法来实现这一目标?我是MySQL的新手,所以如果这是一个显而易见的问题,我很抱歉。
提前感谢您的想法!
P.S。我无法在此表中使用fulltext
,因此无法通过相关性对结果进行排序。
答案 0 :(得分:6)
如何将数据分成两个表 - 一个定义甜点,一个定义选择?这将使查询更简单,更快。
甜点表:
id | dessert
------------
1 | pie
2 | cake
3 | donut
选择表:
id | choice
-----------
1 | apple pie
1 | chocolate pie
2 | chocolate cake
2 | lemon cake
2 | white chocolate cake
2 | triple chocolate cake
3 | frosted donut
3 | chocolate donut
3 | chocolate cream donut
然后你可以这样做:
select `dessert`, count(*) as `matches`
from `desserts` join `choices` using (`id`)
where `choice` like '%chocolate%'
group by `id`
order by `matches` desc
答案 1 :(得分:5)
删除匹配的单词,然后比较字符串长度的差异
SELECT id
, desert
, ( LENGTH(choice) - LENGTH(REPLACE(choice,'chocolate','')) )
/ LENGTH('chocolate') AS matches
FROM desert_table
WHERE choice LIKE '%chocolate%'
ORDER BY 3 DESC