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

Ordenar por dos criterios....id y status

Estas en el tema de Ordenar por dos criterios....id y status en el foro de Mysql en Foros del Web. Tengo: SELECT * FROM listatareas ORDER BY id DESC Necesito Ordenar por dos criterios....id y status quiero que me acomode primero por id y luego... ...
  #1 (permalink)  
Antiguo 04/08/2011, 15:34
 
Fecha de Ingreso: mayo-2011
Mensajes: 167
Antigüedad: 12 años, 11 meses
Puntos: 1
Ordenar por dos criterios....id y status

Tengo: SELECT * FROM listatareas ORDER BY id DESC

Necesito Ordenar por dos criterios....id y status


quiero que me acomode primero
por id y luego...

cuando status == "NULL"
y hasta abajo status == "1"

como lo tengo ke hacer?
  #2 (permalink)  
Antiguo 04/08/2011, 16:27
 
Fecha de Ingreso: abril-2008
Ubicación: Santa Fe, Argentina
Mensajes: 41
Antigüedad: 16 años
Puntos: 14
Respuesta: Ordenar por dos criterios....id y status

Lo que entendí es que querés ordenar por id en forma ascendiente, y status en forma descendiente, pero con los valores NULL apareciendo siempre como el mayor.

ORDER BY admite múltiples parámetros. Para ordenar de la manera que querés, basta con hacer ORDER BY id, status DESC.

El problema que vas a tener es que NULL es siempre el menor, por lo que al ordenar de manera descendiente te va a aparecer al final de la lista, y no al principio.

Para resolver esto se usa una especie de 'hack': Representando los valores en una recta, los NULL siempre tienden a menos infinito, por lo que invirtiendo el signo de status y luego invirtiendo la posición de la recta, los valores de status quedan en su posición original, pero los NULL ahora tienden a más infinito.

Teniendo el data set:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM listatareas;
  2. +----+--------+
  3. | id | status |
  4. +----+--------+
  5. |  1 |   NULL |
  6. |  1 |      5 |
  7. |  1 |     10 |
  8. |  2 |     15 |
  9. |  2 |   NULL |
  10. |  2 |      7 |
  11. +----+--------+

Probamos ordenar primero id en forma ascendiente, y luego status en forma descendiente

Código MySQL:
Ver original
  1. mysql> SELECT * FROM listatareas ORDER BY id ASC, status DESC;
  2. +----+--------+
  3. | id | status |
  4. +----+--------+
  5. |  1 |     10 |
  6. |  1 |      5 |
  7. |  1 |   NULL |
  8. |  2 |     15 |
  9. |  2 |      7 |
  10. |  2 |   NULL |
  11. +----+--------+

El problema es que las celdas con valores NULL aparecen abajo de todo. Esto se soluciona poniendo un menos antes del campo a ordenar e invirtiendo el orden

Código MySQL:
Ver original
  1. mysql> SELECT * FROM listatareas ORDER BY id ASC, -status ASC;
  2. +----+--------+
  3. | id | status |
  4. +----+--------+
  5. |  1 |   NULL |
  6. |  1 |     10 |
  7. |  1 |      5 |
  8. |  2 |   NULL |
  9. |  2 |     15 |
  10. |  2 |      7 |
  11. +----+--------+

Como ahora tenemos dos ORDER BY ... ASC, podemos agruparlos con una coma

Código MySQL:
Ver original
  1. mysql> SELECT * FROM listatareas ORDER BY id, -status ASC;
  2. +----+--------+
  3. | id | status |
  4. +----+--------+
  5. |  1 |   NULL |
  6. |  1 |     10 |
  7. |  1 |      5 |
  8. |  2 |   NULL |
  9. |  2 |     15 |
  10. |  2 |      7 |
  11. +----+--------+

Etiquetas: select, status
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 14:06.