Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Ordenacion a partir de una letra

Estas en el tema de Ordenacion a partir de una letra en el foro de Mysql en Foros del Web. Hola a todos, Necesito ayuda con lo siguiente y por más que he mirado no encuentro una solución. Tengo una tabla con un campo APELLIDO1 ...
  #1 (permalink)  
Antiguo 09/07/2019, 06:47
 
Fecha de Ingreso: septiembre-2007
Mensajes: 16
Antigüedad: 16 años, 6 meses
Puntos: 2
Busqueda Ordenacion a partir de una letra

Hola a todos,
Necesito ayuda con lo siguiente y por más que he mirado no encuentro una solución.
Tengo una tabla con un campo APELLIDO1 que la quiero ordenar a partir de una letra, en lugar de la ordenación típica de ascendente o descendente.
ABAD
BRAVO
CASA
ROMERO
RUIZ
SALMERON
TRIANA

Por ejemplo que la ordenación empieze por la letra R y el resultado sea algo como:
ROMERO
RUIZ
SALMERON
TRIANA
ABAD
BRAVO
CASA

He buscado y probado poniendo algo como:

SELECT * FROM `usuarios` WHERE 1
ORDER BY
CASE WHEN apellidos LIKE "R%" THEN 0
WHEN apellidos LIKE "S%" THEN 1
WHEN apellidos LIKE "T%" THEN 2
ELSE 3
END



Pero hace la ordenación de los apellidos que empiezan con las letras que pongo en el WHEN pero después continua con la A y no con el orden del alfabeto.
Y me parece mala idea poner tantos when como letras del alfabeto porque seguro que falla por algún sitio

Alguna idea? Muchas gracias.

Última edición por lukitas; 09/07/2019 a las 10:28 Razón: Ampliando información
  #2 (permalink)  
Antiguo 09/07/2019, 15:04
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Ordenacion a partir de una letra

Hola lukitas:

En realidad, no estás tan alejado de la solución, simplemente tienes que decir que además del CASE WHEN, te ordene despues por el campo apellido, COMO UN SEGUNDO CRITERIO DE ORDENACIÓN:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------+----------+
  3. | id   | campo    |
  4. +------+----------+
  5. |    1 | ABAD     |
  6. |    2 | BRAVO    |
  7. |    3 | CASA     |
  8. |    4 | ROMERO   |
  9. |    5 | RUIZ     |
  10. |    6 | SALMERON |
  11. |    7 | TRIANA   |
  12. +------+----------+
  13. 7 rows in set (0.00 sec)
  14.  
  15. mysql> SELECT *
  16.     -> FROM tabla
  17.     -> ORDER BY
  18.     -> CASE WHEN campo LIKE "R%" THEN 0
  19.     -> WHEN campo LIKE "S%" THEN 1
  20.     -> WHEN campo LIKE "T%" THEN 2
  21.     -> ELSE 3
  22.     -> END,
  23.     -> campo;
  24. +------+----------+
  25. | id   | campo    |
  26. +------+----------+
  27. |    4 | ROMERO   |
  28. |    5 | RUIZ     |
  29. |    6 | SALMERON |
  30. |    7 | TRIANA   |
  31. |    1 | ABAD     |
  32. |    2 | BRAVO    |
  33. |    3 | CASA     |
  34. +------+----------+
  35. 7 rows in set (0.00 sec)

Haz la prueba y nos comentas.

Saludos
Leo.
  #3 (permalink)  
Antiguo 10/07/2019, 02:44
 
Fecha de Ingreso: septiembre-2007
Mensajes: 16
Antigüedad: 16 años, 6 meses
Puntos: 2
Respuesta: Ordenacion a partir de una letra

Muchas gracias por tu respuesta leonardo_josue.
He probado lo que me has dicho pero la ordenación de otros posibles apellidos no la hace bien.
Si por ejemplo tengo 2 apellidos más:
8 VICENT
9 WELLER

Ejecutando la consulta quedarían así:
4 ROMERO
5 RUIZ
6 SALMERON
7 TRIANA
1 ABAD
2 BRAVO
3 CASA
8 VICENT
9 WELLER
Lo que hace es ordenar por las letras que le pongo en el WHEN y una vez pasadas esas letras empieza por la "A"


Y lo que necesito es que queden:

4 ROMERO
5 RUIZ
6 SALMERON
7 TRIANA
8 VICENT
9 WELLER
1 ABAD
2 BRAVO
3 CASA

Muchas gracias.

Última edición por lukitas; 10/07/2019 a las 02:46 Razón: Ampliando
  #4 (permalink)  
Antiguo 10/07/2019, 14:21
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Ordenacion a partir de una letra

Hola de nuevo lukitas:

Cita:
He probado lo que me has dicho pero la ordenación de otros posibles apellidos no la hace bien.
Si por ejemplo tengo 2 apellidos más:
8 VICENT
9 WELLER
Mucho ojo, en el foro no hay adivinos, es por eso que pedimos siempre datos de ejemplo y a partir de los datos damos una solución... nosotros no sabemos qué información tienes guardada. Lo que planteas en tu segundo ejemplo ya no se parece a lo que planteas originalmente, luego entonces, la solución es distinta.

Prueba esto:

Código MySQL:
Ver original
  1. mysql> SELECT tabla.*
  2.     -> FROM tabla
  3.     -> ORDER BY
  4.     -> CASE WHEN substr(campo, 1, 1) >= 'R'  THEN 1
  5.     -> ELSE 2
  6.     -> END,
  7.     -> campo;
  8. +------+----------+
  9. | id   | campo    |
  10. +------+----------+
  11. |    4 | ROMERO   |
  12. |    5 | RUIZ     |
  13. |    6 | SALMERON |
  14. |    7 | TRIANA   |
  15. |    8 | VICENT   |
  16. |    9 | WELLER   |
  17. |    1 | ABAD     |
  18. |    2 | BRAVO    |
  19. |    3 | CASA     |
  20. +------+----------+
  21. 9 rows in set (0.00 sec)

La idea es tomar la primera letra del apellido y alterar el orden a como lo necesitas.

Saludos
Leo.
  #5 (permalink)  
Antiguo 10/07/2019, 15:15
 
Fecha de Ingreso: septiembre-2007
Mensajes: 16
Antigüedad: 16 años, 6 meses
Puntos: 2
Respuesta: Ordenacion a partir de una letra

Hola Leo.
En primer lugar pedir disculpas por no haber sido más claro en mi pregunta. Consideré que poniendo un pequeño ejemplo con 7 registros sería suficiente. Pero me equivoqué.
Realmente mi tabla tiene unos 3000 registros y por eso simplifiqué aunque demasiado..
Mañana sin falta lo probaré y os cuento.
Gracias de nuevo
  #6 (permalink)  
Antiguo 11/07/2019, 03:13
 
Fecha de Ingreso: septiembre-2007
Mensajes: 16
Antigüedad: 16 años, 6 meses
Puntos: 2
Respuesta: Ordenacion a partir de una letra

Acabo de probar la solución que me has dado y hace exactamente lo que necesito.
Muchas gracias por tu ayuda y sobre todo por tu tiempo.

Etiquetas: case, field, order-by
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:56.