MySQL按匹配数量排序

Sup*_*gel 2 mysql sql select sql-order-by

我正在尝试按行中匹配总数来命令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
Run Code Online (Sandbox Code Playgroud)

......如果有人搜索chocolate,应该订购结果:

dessert | matches
-----------------
cake    | 3
donut   | 2
pie     | 1
Run Code Online (Sandbox Code Playgroud)

但是,我正在努力使这样的查询排序.我在这里看了其他的例子,但是我认为它们看起来相当简单,它们看起来过于复杂.

有没有直接的方法来实现这一目标?我是MySQL的新手,所以如果这是一个明显的问题,我很抱歉.

提前感谢您的想法!

PS我无法fulltext在此表上使用,因此我无法按相关性排序结果.

awm*_*awm 6

如何将数据分成两个表 - 一个定义甜点,一个定义选择?这将使查询更简单,更快捷.

甜点表:

id | dessert
------------
1  | pie
2  | cake
3  | donut
Run Code Online (Sandbox Code Playgroud)

选择表:

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
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

select `dessert`, count(*) as `matches`
       from `desserts` join `choices` using (`id`)
       where `choice` like '%chocolate%'
       group by `id`
       order by `matches` desc
Run Code Online (Sandbox Code Playgroud)


Sod*_*ved 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
Run Code Online (Sandbox Code Playgroud)