ejemplos asc mysql sql sql-order-by

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

  1. un alfabeto
  2. h abit
  3. r ehab

pero me gustaría de esta manera:

  1. hab it (primero porque ''hab'' es el principio)
  2. alp hab et (segundo porque ''hab'' está en el medio de la palabra)
  3. re hab (último porque ''hab'' está al final de la palabra)

o al menos de esta manera:

  1. hab it (primero porque ''hab'' es el principio)
  2. re hab (segundo porque ''hab'' comienza en la tercera letra)
  3. 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 )