asc - MySQL orden por "mejor coincidencia"
order by sql server ejemplos (3)
Tengo una tabla que contiene palabras y un campo de entrada para buscar esa tabla mediante una búsqueda en vivo. Actualmente, utilizo la siguiente consulta para buscar en la tabla:
SELECT word FROM words WHERE word LIKE ''%searchstring%'' ORDER BY word ASC
¿Hay una manera de ordenar los resultados de modo que las que tienen la cadena al principio de la palabra sean las primeras y las que aparecen más adelante en la palabra?
Un ejemplo: la búsqueda de '' hab '' actualmente regresa
- un alfabeto
- h abit
- r ehab
pero me gustaría de esta manera:
- hab it (primero porque ''hab'' es el principio)
- alp hab et (segundo porque ''hab'' está en el medio de la palabra)
- re hab (último porque ''hab'' está al final de la palabra)
o al menos de esta manera:
- hab it (primero porque ''hab'' es el principio)
- re hab (segundo porque ''hab'' comienza en la tercera letra)
- alp hab et (último porque ''hab'' comienza más tarde, en la cuarta letra)
¡Sería genial si alguien pudiera ayudarme con esto!
Intente de esta manera:
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
Para hacerlo de la primera manera (comienza la palabra, en medio de la palabra, termina la palabra), intente algo como esto:
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
Para hacerlo de la segunda manera (posición de la cadena coincidente), use la función LOCATE
:
SELECT word
FROM words
WHERE word LIKE ''%searchstring%''
ORDER BY LOCATE(''searchstring'', word)
También puede querer un desempate en caso de que, por ejemplo, más de una palabra comience con hab
. Para hacer eso, sugeriría:
SELECT word
FROM words
WHERE word LIKE ''%searchstring%''
ORDER BY <whatever>, word
En el caso de varias palabras que empiecen por hab
, las palabras que empiecen por hab
se agruparán y clasificarán alfabéticamente.
Podría usar la función INSTR
para devolver la posición inicial de la cadena de búsqueda dentro de la palabra,
ORDER BY INSTR(word,searchstring)
Para hacer que el conjunto de resultados sea más determinista cuando la cadena de búsqueda aparezca en la misma posición en dos palabras diferentes, agregue una segunda expresión a ORDER BY:
ORDER BY INSTR(word,searchstring), word
(Por ejemplo, searchstring hab
aparece en la segunda posición de chablis
y shabby
)