Comunidad de diseño web y desarrollo en internet online

SQL: Ordenar resultados alfanuméricos por prioridad.

Citar            
MensajeEscrito el 12 Ago 2011 06:16 pm
En realidad no sé cómo se llama el tipo de ordenación que busco así que pondré un ejemplo:
Supongamos que hay una tabla con las ciudades de un país (la estructura no es importante, puede ser cualquier campo varchar) y deseo encontrar las ciudades que tienen un lexema, por ejemplo iba.

Lo obvio es hacer:

Código MySQL :

SELECT `nombreciudad` FROM `ciudades` WHERE LOWER(`nombreciudad`) LIKE LOWER('%iba%');


Esto devolverá una lista tal como:

Código :

Ibañez
Juan F. Ibarra
Libano
Pedro Nicolas Escribano
Villa Garibaldi
Ibahay
Arribeños
Ibaviyu
Nacimientos de Arriba
Puesto de Arriba
Punta de Aguas Arriba


Como deseo los resultados ordenados, entonces:

Código MySQL :

SELECT `nombreciudad` FROM `ciudades` WHERE LOWER(`nombreciudad`) LIKE LOWER('%iba%') ORDER BY `nombreciudad`;

Me devuelve:

Código :

Arribeños
Ibahay
Ibañez
Ibaviyu
Juan F. Ibarra
Libano
Nacimientos de Arriba
Pedro Nicolas Escribano
Puesto de Arriba
Punta de Aguas Arriba
Villa Garibaldi


Sin embargo lo que deseo es que aquellos resultados que comiencen con el lexema buscado aparezcan primero, y luego de estos los que tengan el lexema en cualquier otra parte.
O sea, deseo que el ejemplo esté ordenado así:

Código :

Ibahay
Ibañez
Ibaviyu
Arribeños
Juan F. Ibarra
Libano
Nacimientos de Arriba
Pedro Nicolas Escribano
Puesto de Arriba
Punta de Aguas Arriba
Villa Garibaldi


Si uso esta consulta:

Código MySQL :

SELECT `nombreciudad` FROM `ciudades` WHERE LOWER(`nombreciudad`) LIKE LOWER('iba%') ORDER BY `nombreciudad`;

Me trae solo los que comienzan con el lexema pero no los demás. Y hacer algo como esto:

Código MySQL :

SELECT `nombreciudad` FROM `ciudades` WHERE (LOWER(`nombreciudad`) LIKE LOWER('iba%')) OR (LOWER(`nombreciudad`) LIKE LOWER('%iba%')) ORDER BY `nombreciudad`;

Es lo mismo que el primer caso.

Me gustaría resolver esto con una sola consulta. ¿Alguna idea?.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 12 Ago 2011 09:32 pm
Puedes usar UNION?

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 12 Ago 2011 10:03 pm
Nunca lo usé pero siempre hay una primera vez ;)

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 15 Ago 2011 07:04 pm
Gracias a la pista proporcionada por Maikel, he encontrado la solución, al menos una que sirve a mis propósitos. Es como sigue:

Código MySQL :

(SELECT * FROM `ciudades` WHERE LOWER(`nombreciudad`) LIKE LOWER('iba%')  ORDER BY `nombreciudad`)
UNION 
(SELECT * FROM `ciudades` WHERE LOWER(`nombreciudad`) LIKE LOWER('%iba%')
ORDER BY `nombreciudad` LIMIT 10)
LIMIT 10


El último "LIMIT 10" es arbitrario. Los que son parte del SELECT son necesarios pues de otra forma la cláusula ORDER BY no tiene efecto (está explicado en la documentación de UNION).

Por DriverOp

Claber

2510 de clabLevel



 

opera

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.