【问题标题】:MySQL Order By Number of MatchesMySQL 按匹配数排序
【发布时间】:2011-08-04 19:53:13
【问题描述】:

我正在尝试按一行中的匹配总数来排序 MySQL 选择语句。例如,如果表格看起来像 ...

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 新手,所以如果这是一个明显的问题,我很抱歉。

提前感谢您的想法!

附:我无法在此表上使用fulltext,因此我无法按相关性对结果进行排序。

【问题讨论】:

  • 表是MyISAM 还是InnoDB?在MyISAM 表中,即使不创建FULLTEXT 索引,您也可以使用一些FULLTEXT 功能。
  • 您可以更换桌子吗?在您的选择字段中使用逗号分隔的列表,您违反了规范化规则...如果您可以更改它,awm 的表结构应该是您所使用的......
  • 谢谢大家。 Quassnoi,它是 MyISAM。如果没有FULLTEXT 索引,我不知道某些功能仍然可用,因此感谢您的提示。 Leslie,是的,我最终采用了这个解决方案。原始数据是 CSV 格式的,所以我认为一张表就可以了。我错了:)

标签: mysql sql select sql-order-by


【解决方案1】:

如何将您的数据分成两张表——一张定义甜点,一张定义选择?这将使查询更简单、更快捷。

甜品桌:

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

【讨论】:

  • 谢谢awm!我刚刚完成了拆分表(实际上有 100,000 个“甜点”和 170,000 个“选择”)。无论如何,经过一些快速测试:a) 它运行良好,b) 它比单表解决方案快 29-42%。非常感谢您的明确指导和榜样;我学到了很多东西。
【解决方案2】:

只需去掉匹配的单词,然后比较字符串长度的差异

SELECT id
     , desert
     , ( LENGTH(choice) - LENGTH(REPLACE(choice,'chocolate','')) )
       / LENGTH('chocolate') AS matches
FROM desert_table
WHERE choice LIKE '%chocolate%'
ORDER BY 3 DESC

【讨论】:

  • 感谢 Sodved!这是一个非常聪明的方法;我不会想到使用字符串长度来计算匹配项,而且它也增加了相对较少的开销。最后,由于性能优势,我选择了上面的解决方案,但如果我只需要使用一张表,那么您的解决方案将是完美的。再次感谢;这真的很有帮助! (P.S. 对于任何其他使用混合大小写字符串的人,请记住 LOWER() REPLACE() 值,否则你会得到一些不正确的 '0' 匹配)。
猜你喜欢
  • 2013-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多