
¿Cómo ordenar varias columnas a la vez en MySQL?
Capítulo 18: La cláusula ORDER BY con varios campos
Algo bastante interesante que se nos permite realizar con ORDER BY
, es realizar un orden más complejo implicando a más de una columna a la vez. Ten cuidado aquí, ya que si no piensas bien lo que estás haciendo, puedes dar órdenes que no tengan ningún sentido y que el orden devuelto sea un completo desastre. Tampoco es algo grave. Con SELECT
, que es lo único que hemos visto hasta ahora, solo realizamos consultas a la base de datos, no hay modificaciones.
Voy a plantearte un orden de dos campos coherente para que tengas un ejemplo. Vayamos a la tabla orders
(pedidos). En ella tenemos el campo status
, (estado) que lleva la información sobre el estado de los pedidos (si se han enviado, si están en preparación, etc.). También tenemos el campo shippedDate
(fecha de envío) que nos da la fecha en la cual se envío el pedido.
Ordenemos primero el estado de los pedidos en orden descendente. El campo status
tiene los siguientes valores en sus registros: Cancelled
(cancelado), Disputed
(hay una disputa abierta), In process
(en proceso), On Hold
(en espera), Resolved
(resuelto) y Shipped
(enviado).
Conociendo entonces como se almacena la información en este campo, podemos idear una estrategia, quiero agrupar los pedidos por cada tipo, es decir, que los enviados aparezcan con los enviados, los cancelados con los cancelados, etc. y que no estén mezclados. Si ordenamos este campo en orden descendente, puesto que la "S" en orden alfabético es mayor que cualquiera de los posibles estados de este campo, obtendremos primero todos los registros en estado Shipped
.
Ten cuidado con este tipo de consultas. Ahora nos funcionará bien, pero si en el futuro se añaden más posibles valores nuevos al campo status, la consulta podría no funcionar como esperábamos, si hay algún valor con una letra superior a la "S".
Después de este orden, quiero además, que de forma ascendente, se muestre el campo shippedDate
, así, lo primero que encontraré, serán todos los pedidos enviados y odenados por fecha ascendente. Toda esta lógica, puede que te parezca complicada, no lo es, tan solo es práctica. De aquí nada te empezará a salir sola.
SELECT * FROM orders ORDER BY status DESC, shippedDate ASC;
Fíjate que el primer campo ordenado (aparece con un 1 en la imagen) es el que tiene preferencia, después, el segundo (2 en la imagen) se ordena respetando el primer orden y así lo mismo con más campos, si los hubiera.

Fíjate en la sintaxis del comando SQL, el ORDER BY
, se escribe una única vez independientemente de los campos que tenga. Cada campo del ORDER BY
, se separa con una coma.
La palabra STATUS, está reservada por SQL, aún así, en el comando estamos utilizando dicha palabra para referirnos al campo status. No hay problema, SQL entiende que lo que viene después del ORDER BY, es un campo y no una palabra reservada del lenguaje.
Comentarios
Si te quedan dudas sobre el temario, sobre SQL, MySQL o cualquier otra cosa relacionada o simplemente quieres agradecer, aquí tienes tu sitio para dejar tu granito de arena. Gracias por tus comentarios y por darle vida a este sitio web.