2010-07-31 8 views
0

J'ai une base de données de titres de chansons. Chaque titre de chanson a un score entier assigné. Plus le score est élevé, plus il se classe sur mon site. Donc, si "Lady Gaga - Poker Face" a un score de 23039, et "Eminem - Not Afraid" a un score de 13400, Lady Gaga sera au dessus d'Eminem.mySQL recherche/MATCH() AGAINST() aide

Ceci est bien sûr accompli par un simple ordre par le score DESC

Cependant, mon site a également une fonction de recherche où les gens peuvent entrée d'un mot clé pour retourner une liste des titres des chansons. Je le fais avec une requête MATCH() CONTRE() comme ceci:

Méthode n ° 1

SELECT * FROM links MATCH(songtitle) AGAINST({the keyword}) LIMIT 5'; 

Cela fonctionne, mais je veux afficher ces 5 résultats afin de leur score. Toutefois, si je joue cette requête à la place:

Méthode n ° 2

SELECT * FROM links MATCH(songtitle) AGAINST({the keyword}) ORDER BY score DESC LIMIT 5'; 

Ensuite, l'ordre de pertinence est complètement perdu. Je veux commander les résultats retournés par score ET par pertinence.

Prenez cet exemple ensemble de données et scénarios:

Data Set:

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 

Scénarios:

  • Lorsque vous effectuez une recherche pour "Pink Floyd" en utilisant le premier méthode ci-dessus, vous recevez 5 Pink Flo yd chansons dans un ordre apparemment aléatoire. C'est super, mais, je veux que les morceaux qui sont retournés soient classés par leur score dans l'ordre décroissant. Donc, vous ajoutez « ORDER BY partition DESC » à la première méthode et que vous donne la deuxième méthode ci-dessus ...

  • Lorsque vous effectuez une recherche pour « Pink Floyd » en utilisant la deuxième méthode ci-dessus, vous recevez des chansons de Pink Floyd dans le bon ordre (ordonné par le score DESC), mais maintenant vous recevez également deux chansons de l'artiste pop "Pink", car il y a 2 chansons dans la base de données par Pink avec un score plus élevé que l'une des chansons Pink Floyd.

résultats souhaités:

  • Recherche pour "Pink Floyd" retourne tous les 5 chansons pink floyd, commandés par leur score attribué dans l'ordre décroissant.

  • La recherche de "Pink" renvoie les deux chansons de Pink dans l'ordre décroissant de leur score. Si les chansons de Pink Floyd apparaissaient après les deux chansons de Pink, ça irait aussi.

Vous voyez ce que je veux dire? Faites-moi savoir si vous avez besoin de clarification!

Dave

Répondre

0

On dirait que vous pourriez être en mesure d'obtenir la « pertinence » du match - vérifier this link. Compte tenu de cela, vous pouvez commander d'abord par la pertinence, puis par le score.

+0

Auriez-vous des exemples de code par hasard? J'ai lu sur l'utilisation de MATCH() AGAINST() en mode booléen, etc. mais je ne suis pas sûr à 100% de ce dont j'ai besoin. Est-ce ce dont vous parlez? – Dave

+0

'fraid not - le lien fourni contient des exemples de code - n'est-ce pas bon pour vous? –

+0

Je vais vérifier plus en profondeur ce soir, pourrait faire l'affaire. Merci – Dave