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
mais j'aimerais ça de cette façon:
ou du moins de cette façon:
Ce serait génial si quelqu'un pouvait m'aider avec ça!
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.
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
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
)