Curso de MySQL desde cero

¿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.

Order by con múltiples campos

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.

Programación Fácil YouTube

Suscríbete

Si te ha gustado este curso y crees que el trabajo merece la pena, te agradeceré eternamente que te suscribas a mi canal de YouTube para apoyarme y que pueda seguir haciendo cursos gratuitos.

Además, si te encanta la programación, tienes un montón más de cursos gratuitos para ver.

No solo eso, podrás participar enviándome comentarios con tus sugerencias para temas específicos o cursos completos o incluso las dudas que tengas y las intentaré ir resolviendo en los cursos que estén todavía abiertos.