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

Query SELECT ORDER según casos

Estas en el tema de Query SELECT ORDER según casos en el foro de Mysql en Foros del Web. Buenas tardes a tod@s ... Creo que esto se puede hacer, pero no estoy seguro. Quiero intentar sacar los registros de una tabla ordenados por ...
  #1 (permalink)  
Antiguo 30/01/2013, 11:16
 
Fecha de Ingreso: junio-2008
Ubicación: Madrid
Mensajes: 73
Antigüedad: 15 años, 10 meses
Puntos: 1
Pregunta Query SELECT ORDER según casos

Buenas tardes a tod@s ...

Creo que esto se puede hacer, pero no estoy seguro.
Quiero intentar sacar los registros de una tabla ordenados por una serie de columnas según el caso.

La tabla contiene una relación de datos, entre ellas un campo texto, un booleano y un indice (no el indice del registro).
Quiero intentar ordenar los resultados de la QUERY en función del campo booleano de la siguiente forma:

- Si el booleano = TRUE -> ORDER BY indice, texto
- Si el booleano = FALSE -> ORDER BY texto

He probado con SELECT .. FROM .. ORDER BY CASE WHEN .. THEN ..;
Pero no funciona ...

¿Alguna sugerencia?
Muchas gracias.

Edit.1
He conseguido ordenar según casos con el siguiente código:
Código:
SELECT texto, orden FROM tabla ORDER BY
   CASE WHEN bool = true THEN texto
            WHEN bool = false THEN texto
            ELSE id
   END;
El problema es que no consigo enlazar, para el primer CASE WHEN, que se filtre por dos campos diferentes. Por ejemplo:
Código:
SELECT texto, orden FROM tabla ORDER BY
   CASE WHEN bool = true THEN texto, orden
            WHEN bool = false THEN texto
            ELSE id
   END;
He probado con 'AND':
Código:
SELECT texto, orden FROM tabla ORDER BY
   CASE WHEN bool = true THEN texto AND orden
            WHEN bool = false THEN texto
            ELSE id
   END;
Pero los resultados son horribles ...

Última edición por Wolfchamane; 30/01/2013 a las 11:35 Razón: anexo códigos
  #2 (permalink)  
Antiguo 30/01/2013, 13:05
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Query SELECT ORDER según casos

Hola Wolfchamane:

No entiendo muy bien cómo es que quieres ordenar la información... creo que sería conveniente que nos pusieras algunos datos de ejemplo y que nos mostraras cómo esperas la salida... de esta manera tal vez podríamos darte una respuesta puntual. Por lo Pronto se me ocurre que hagas algo como esto, supongamos que tienes más o menos estos datos:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +--------+---------+--------+
  3. | indice | boleano | texto  |
  4. +--------+---------+--------+
  5. |      1 |       1 | uno    |
  6. |      3 |       0 | tres   |
  7. |      4 |       1 | cuatro |
  8. |      2 |       1 | dos    |
  9. |      7 |       0 | siete  |
  10. |      9 |       1 | nueve  |
  11. |      8 |       0 | ocho   |
  12. |      6 |       1 | seis   |
  13. |     10 |       0 | diez   |
  14. |      5 |       1 | cinco  |
  15. +--------+---------+--------+
  16. 10 rows in set (0.00 sec)

Ahora bien, si entendí bien qué es lo que quieres hacer es ordenar primero todos aquellos registros que tengan el campo boleano como TRUE, pero estos registros ordenarlos en primer lugar por el índice y después por el texto... en seguida presentar todos los registros que tengan en el campo boleano FALSE, pero estos ordenarlos sólo por el texto... creo que podrías hacerlo más o menos así:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla
  2.     -> ORDER BY
  3.     -> IF(boleano, indice, 9999999999) , texto;
  4. +--------+---------+--------+
  5. | indice | boleano | texto  |
  6. +--------+---------+--------+
  7. |      1 |       1 | uno    |
  8. |      2 |       1 | dos    |
  9. |      4 |       1 | cuatro |
  10. |      5 |       1 | cinco  |
  11. |      6 |       1 | seis   |
  12. |      9 |       1 | nueve  |
  13. |     10 |       0 | diez   |
  14. |      8 |       0 | ocho   |
  15. |      7 |       0 | siete  |
  16. |      3 |       0 | tres   |
  17. +--------+---------+--------+
  18. 10 rows in set (0.01 sec)

Observa que el 9999999999 es simplemente un número enorme, mayor que cualquier índice, para asegurar que estos se van a presentar al final de la lista... .ls primeros 6 registros están ordenados por ambos campos, indice y texto... los últimos 4 registros sólo están ordenados por el texto...

Dale un vistazo para ver si esto esto te puede servir, y cualquier cosa la comentas en el foro.

Saludos
Leo.
  #3 (permalink)  
Antiguo 31/01/2013, 09:14
 
Fecha de Ingreso: junio-2008
Ubicación: Madrid
Mensajes: 73
Antigüedad: 15 años, 10 meses
Puntos: 1
Respuesta: Query SELECT ORDER según casos

Hola,

No "puedo" ponerte el caso concreto, así que me he inventado una tabla de películas, que puede ser el caso más "parecido".

Esta sería la tabla original:
Código MySQL:
Ver original
  1. mysql> SELECT * FROM `peliculas`;
  2. +----+----------------+-------+---+
  3. | id | titulo         | saga  | o |
  4. +----+----------------+-------+---+
  5. |   1| Star Wars Ep.1 | TRUE  | 1 |
  6. |   2| Star Wars Ep.2 | TRUE  | 2 |
  7. |   3| Star Wars Ep.3 | TRUE  | 3 |
  8. |   4| Saw 1          | TRUE  | 1 |
  9. |   5| Saw 3          | TRUE  | 3 |
  10. |   6| Saw 4          | TRUE  | 4 |
  11. |   7| Saw 2          | TRUE  | 2 |
  12. |   8| Armaggedon     | FALSE | 0 |
  13. +----+----------------+-------+---+

Ya que puede que el usuario final, introduzca los datos en el orden correcto, o no.
Entonces, lo que quiero es que las películas se ordenen, en orden alfabético, y dentro de ese orden, aquellas que pertenezcan a una saga, en el orden que ocupan dentro de la saga, por ejemplo:

Código MySQL:
Ver original
  1. +----+----------------+-------+---+
  2. | id | titulo         | saga  | o |
  3. +----+----------------+-------+---+
  4. |   1| Armaggedon     | FALSE | 0 |
  5. |   2| Saw 1          | TRUE  | 1 |
  6. |   3| Saw 2          | TRUE  | 2 |
  7. |   4| Saw 3          | TRUE  | 3 |
  8. |   7| Saw 4          | TRUE  | 4 |
  9. |   1| Star Wars Ep.1 | TRUE  | 1 |
  10. |   2| Star Wars Ep.2 | TRUE  | 2 |
  11. |   3| Star Wars Ep.3 | TRUE  | 3 |
  12. +----+----------------+-------+---+
  #4 (permalink)  
Antiguo 31/01/2013, 10:01
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Query SELECT ORDER según casos

Hola de nuevo Wolfchamane:

No entiendo donde está la complicación... con los datos que pones de ejemplo, en realidad la ordenación es simple, no tienes que hacer ningún tratamiento adicional.

Suponiendo que tienes estos datos

Código MySQL:
Ver original
  1. mysql> SELECT * FROM peliculas;
  2. +------+----------------+------+------+
  3. | id   | titulo         | saga | o    |
  4. +------+----------------+------+------+
  5. |    1 | Star Wars Ep.1 |    1 |    1 |
  6. |    2 | Star Wars Ep.2 |    1 |    2 |
  7. |    3 | Star Wars Ep.3 |    1 |    3 |
  8. |    4 | Saw 1          |    1 |    1 |
  9. |    5 | Saw 3          |    1 |    3 |
  10. |    6 | Saw 4          |    1 |    4 |
  11. |    7 | Saw 2          |    1 |    2 |
  12. |    8 | Armaggedon     |    0 |    1 |
  13. |    9 | Otra peli      |    1 |    1 |
  14. |   10 | Otra peli      |    0 |    1 |
  15. |   11 | Otra peli      |    0 |    1 |
  16. |   12 | Otra peli      |    1 |    2 |
  17. +------+----------------+------+------+
  18. 12 rows in set (0.00 sec)

Tu puedes hacer algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM peliculas ORDER BY titulo, saga, o;
  2. +------+----------------+------+------+
  3. | id   | titulo         | saga | o    |
  4. +------+----------------+------+------+
  5. |    8 | Armaggedon     |    0 |    1 |
  6. |   11 | Otra peli      |    0 |    1 |
  7. |   10 | Otra peli      |    0 |    1 |
  8. |    9 | Otra peli      |    1 |    1 |
  9. |   12 | Otra peli      |    1 |    2 |
  10. |    4 | Saw 1          |    1 |    1 |
  11. |    7 | Saw 2          |    1 |    2 |
  12. |    5 | Saw 3          |    1 |    3 |
  13. |    6 | Saw 4          |    1 |    4 |
  14. |    1 | Star Wars Ep.1 |    1 |    1 |
  15. |    2 | Star Wars Ep.2 |    1 |    2 |
  16. |    3 | Star Wars Ep.3 |    1 |    3 |
  17. +------+----------------+------+------+
  18. 12 rows in set (0.00 sec)

es decir, simplemente listas todos los campos por los que quieres ordenar... en este caso, en primer lugar por el título, después por la saga y al final por el campo orden. En realidad no sé que función tenga el campo SAGA, por lo menos para los datos que pones de ejemplo no sirve absolutamente para nada... yo agregué 4 registros con el título "Otra peli" donde pongo dos registros como parte de una saga y dos sin ser parte de una... aunque tienen la misma descripción primero colocará aquellos que no forman parte de una saga y al final los que si...

Si esto no te sirve entonces tendrías que colocar datos donde la ordenación no se esté efectuando como quieres...

Saludos
Leo.

Etiquetas: condicional, queries, resultados, select
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 07:34.