Ver Mensaje Individual
  #4 (permalink)  
Antiguo 13/01/2011, 12:10
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Ordenar por 2 campos juntos

Hola solovoy,

Creo que te estás complicando la existencia cuando pudieras utilizar búsquedas de texto completo, pero bueno como dice el dicho al cliente lo que pida.

Si entendí bien tu tabla artistas más o menos tiene la siguiente información:

Código:
id|nombre|apellido
-------------------------------
1|La Renga|null
2|Led Zepellin|null
3|John|Lennon
4|Leo|Garcia
5|The Libertines|null
6|Los Piojos|null
7|Luis Miguel|null
8|Los Amantes de Lola|null
9|José Luis|Perales

Ahora bien, según entendí para el caso de John Lennon, quieres presentarlo como Lennon, John, lo mismo que para The Liberties (Liberties, The) y pongo un ejemplo con nombre y apellido con L intermedia: José Luis Perales, debería presentar Luis Perales, José.

Lo que se me ocurre es que hagas subconsultas para cada uno de los casos, y al final hagas la unión. de esta manera podrías armar el nombre tal y como quieras que se presente y ordenarlos al final, sería algo así.

Código MySQL:
Ver original
  1. select id, concat(nombre, if(apellido is not null, concat(' ', apellido), '')) as artista from Artistas where nombre like ('L%')
  2. select id, concat(apellido, ', ', nombre) as artista from Artistas where apellido like ('L%')
  3. select id,
  4. concat(substring(nombre, instr(nombre, ' L') + 1 , length(nombre)), if(apellido is not null, concat(' ', apellido), '') , ', ', substring(nombre, 1, instr(nombre, ' L') - 1)) as nombre
  5. from Artistas where instr(nombre, ' L') > 0 and nombre not like 'L%'
  6. order by artista

La consulta se construye con tres subconsultas,

-La primera obtiene todos los registros cuyo NOMBRE comience con L presenta nombre + apellido.

-La segunda obtiene los registros cuyo APELLIDO comience con L y presenta apellido + nombre

-La tercer es más complicada, primero busca si el nombre contiene alguna palabra que comience con ' L' es decir que alguna palabra intermedia en el nombre comienza con L, si es así entonces "voltea" la cadena, presentando primero la palabra que comienza con L y el apellido (si lo tuviera) y después el inicio de la cadena.

Para el caso de Los amantes de Lola, estoy filtrando los resultados para que no te los presente como (Lola, Los Amantes de)

Si hubiera algún detalle adicional que quieras considerar pues es cuestión de que lo integres como criterio de alguna de las consultas o como una consulta adicional.

el ejemplo está probado en MySQL, si utilizas algún otro Manejador sería cuestión de encontrar la sintaxis y las funciones respectivas.

Puede que exista alguna otra forma más sencilla de hacer esto, pero de primera es lo único que se me ocurrió.

Saludos
Leo