MySQL按匹配数量排序

时间:2011-04-13 15:18:42

标签: 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

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

dessert | matches
-----------------
cake    | 3
donut   | 2
pie     | 1

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

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

提前感谢您的想法!

P.S。我无法在此表中使用fulltext,因此无法通过相关性对结果进行排序。

2 个答案:

答案 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