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在此表上使用,因此我无法按相关性排序结果.
如何将数据分成两个表 - 一个定义甜点,一个定义选择?这将使查询更简单,更快捷.
甜点表:
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)
只需删除匹配的单词,然后比较字符串长度的差异
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)