2010-07-31 99 views
0

我有一个歌曲标题的数据库。每首歌曲标题都有一个分配的整数分数。分数越高,它在我的网站上排名越高。因此,如果“Lady Gaga - Poker Face”得分为23039,而“Eminem - Not Afraid”的得分为13400,Lady Gaga将高于Eminem。mySQL搜索/ MATCH()AGAINST()帮助

当然,这是通过简单的ORDER BY完成得分降序

然而,我的网站还具有搜索功能,人们可以输入一个关键字短语返回歌曲名称的列表。我这样做了MATCH()反对()查询,像这样:

方法#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 

方案:

  • 当你搜索 “平克·弗洛伊德的” 使用第一方法上面,你收到5 Pink Flo以看似随意的顺序播放yd歌曲。这太好了,但是,我希望返回的歌曲按其得分按降序排列。所以,你“ORDER BY DESC得分”添加到第一个方法,让你在上面第二种方法...

  • 当你搜索“平克·弗洛伊德”使用第二上面的方法,您会收到Pink Floyd乐队的歌曲(按照DESC排序),但现在您还会收到流行音乐人“Pink”的两首歌曲,因为Pink的数据库中有两首歌曲的分数高于任何Pink Floyd歌曲的分数。

期望的结果:

  • 搜索 “平克·弗洛伊德” 按降序返回所有5名Pink Floyd乐队的歌曲,由他们指定的分值排序。

  • 搜索“Pink”会按照指定分数的降序返回Pink的两首歌曲。如果Pink Floyd的歌曲出现在Pink歌曲后面,那也可以。

明白我的意思?让我知道你是否需要任何澄清!

戴夫

回答

0

看起来你可能能够得到比赛的“相关性” - 退房this link。鉴于此,您可以先按相关性排序,然后按评分排序。

+0

你有偶然的任何代码示例吗?我读过关于在布尔模式中使用MATCH()AGAINST()等,但我不是100%确定我需要什么。这是你在说什么吗? – Dave 2010-08-01 00:14:10

+0

'不是 - 提供的链接有一些代码示例 - 它们对你没有好处吗? – 2010-08-01 00:16:03

+0

今晚我会更深入地检查一下,可能会有诀窍。谢谢 – Dave 2010-08-01 00:30:50