Ver Mensaje Individual
  #2 (permalink)  
Antiguo 04/08/2011, 16:27
Henkka
 
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. +----+--------+