我有一个歌曲标题数据库。每首歌曲标题都有一个指定的整数分数。分数越高,我的网站排名越高。
因此,如果“Lady Gaga - Poker Face”得分为23039,而“Eminem - Not Afraid”得分为13400,那么Lady Gaga将会超过Eminem。
这当然是通过简单的ORDER BY得分DESC
来完成的但是,我的网站还有一个搜索功能,人们可以输入关键词短语来返回歌曲标题列表。我使用MATCH()AGAINST()查询这样做:
方法#1
SELECT * FROM links MATCH(songtitle) AGAINST({the keyword}) LIMIT 5';
这有效,但我希望按照得分的顺序显示这5个结果。但是,如果我改为执行此查询:
方法#2
SELECT * FROM links MATCH(songtitle) AGAINST({the keyword}) ORDER BY score DESC LIMIT 5';
然后相关性的顺序完全丢失。我想按分数和相关性来订购返回的结果。
以此示例数据集和方案为例:
数据集:
song title | score
pink - sober | 2002
pink - funhouse | 2001
pink floyd - high hopes | 2000
pink floyd - on the run | 1999
pink floyd - brain damage | 1998
pink floyd - money | 1997
pink floyd - time | 1996
方案:
当您使用上面的第一个方法搜索“Pink Floyd”时,您会以看似随机的顺序收到5首Pink Floyd歌曲。这很棒,但,我希望返回的歌曲按其得分按降序排序。所以你在第一个方法中添加了“ORDER BY得分DESC”,它为你提供了上面的第二个方法......
当您使用上面的 second 方法搜索“Pink Floyd”时,您会按照正确的顺序收到Pink Floyd歌曲(按得分DESC排序),但现在您还会收到两首歌曲由流行艺术家“粉红色”,因为粉红色的数据库中有2首歌曲的得分高于任何Pink Floyd歌曲。
期望的结果:
搜索“Pink Floyd”会返回所有5首粉红色的弗洛伊德歌曲,按照指定的分数降序排列。
搜索“粉红色”按照指定分数的降序返回粉红色的两首歌曲。如果Pink Floyd的歌曲出现在两首Pink歌曲之后,那也没关系。
明白我的意思?如果您需要任何澄清,请告诉我们!
戴夫