web-dev-qa-db-fra.com

Ordre MySQL par "meilleure correspondance"

J'ai une table qui contient des mots et un champ de saisie pour rechercher cette table à l'aide d'une recherche en direct. Actuellement, j'utilise la requête suivante pour rechercher la table:

SELECT Word FROM words WHERE Word LIKE '%searchstring%' ORDER BY Word ASC

Existe-t-il un moyen d'ordonner les résultats afin que ceux où la chaîne se trouve au début du mot viennent en premier et ceux où la chaîne apparaît plus tard dans le mot viennent en dernier?

Un exemple: la recherche de 'hab' renvoie actuellement

  1. a lphabet
  2. h abit
  3. r ehab

mais j'aimerais ça de cette façon:

  1. hab it (d'abord parce que 'hab' est le début)
  2. alp hab et (deuxième parce que 'hab' est au milieu de la Parole)
  3. re hab (dernier parce que 'hab' est à la fin de la Parole)

ou du moins de cette façon:

  1. hab it (d'abord parce que 'hab' est le début)
  2. re hab (deuxième parce que 'hab' commence à la troisième lettre)
  3. alp hab et (dernier parce que 'hab' commence au plus tard, à la quatrième lettre)

Ce serait génial si quelqu'un pouvait m'aider avec ça!

31
eevaa

Pour le faire de la première façon (démarre Word, au milieu de Word, termine Word), essayez quelque chose comme ceci:

SELECT Word
FROM words
WHERE Word LIKE '%searchstring%'
ORDER BY
  CASE
    WHEN Word LIKE 'searchstring%' THEN 1
    WHEN Word LIKE '%searchstring' THEN 3
    ELSE 2
  END

Pour le faire de la deuxième façon (position de la chaîne correspondante), utilisez la fonction LOCATE :

SELECT Word
FROM words
WHERE Word LIKE '%searchstring%'
ORDER BY LOCATE('searchstring', Word)

Vous pouvez également souhaiter un bris d'égalité au cas où, par exemple, plus d'un mot commence par hab. Pour ce faire, je suggère:

SELECT Word
FROM words
WHERE Word LIKE '%searchstring%'
ORDER BY <whatever>, Word

Dans le cas de plusieurs mots commençant par hab, les mots commençant par hab seront regroupés et triés par ordre alphabétique.

69
Ed Gibbs

Essayez de cette façon:

SELECT Word 
FROM words 
WHERE Word LIKE '%searchstring%' 
ORDER BY CASE WHEN Word = 'searchstring' THEN 0  
              WHEN Word LIKE 'searchstring%' THEN 1  
              WHEN Word LIKE '%searchstring%' THEN 2  
              WHEN Word LIKE '%searchstring' THEN 3  
              ELSE 4
         END, Word ASC
13
Parado

Vous pouvez utiliser la fonction INSTR pour renvoyer la position de départ de la chaîne de recherche dans Word,

 ORDER BY INSTR(Word,searchstring)

Pour rendre l'ensemble de résultats plus déterministe lorsque la chaîne de recherche apparaît dans la même position dans deux mots différents, ajoutez une deuxième expression à ORDER BY:

 ORDER BY INSTR(Word,searchstring), Word

(Par exemple, la chaîne de recherche hab apparaît en deuxième position à la fois chablis et shabby)

7
spencer7593