W3docs

Uso de la cláusula MySQL ORDER BY en PHP

Aprende a usar ORDER BY en MySQL con PHP para ordenar resultados por una o más columnas de forma ascendente, descendente y de manera segura.

Una consulta SELECT sin ORDER BY devuelve las filas en un orden que MySQL no garantiza — puede cambiar entre ejecuciones, versiones del servidor o tras el mantenimiento de la tabla. La cláusula ORDER BY hace ese orden explícito, ordenando el conjunto de resultados por una o más columnas. Esta página muestra cómo usarla desde PHP: la sintaxis, orden ascendente frente a descendente, ordenación por varias columnas, dónde quedan los valores NULL y cómo ordenar por una columna suministrada por el usuario de forma segura para no abrir una vulnerabilidad de inyección SQL.

Si eres nuevo en la ejecución de consultas desde PHP, comienza con conectarse a MySQL y seleccionar datos primero.

Sintaxis

SELECT column1, column2, ...
FROM table_name
ORDER BY column1 [ASC | DESC], column2 [ASC | DESC], ...;
  • ASC ordena de forma ascendente (A→Z, 0→9, más antiguo→más nuevo) y es el valor predeterminadoORDER BY age y ORDER BY age ASC son idénticos.
  • DESC ordena de forma descendente (Z→A, 9→0, más nuevo→más antiguo).
  • La dirección se aplica por columna, por lo que puedes combinarlas: ORDER BY country ASC, age DESC.

ORDER BY se ejecuta después del filtrado con WHERE y el GROUP BY, de modo que solo ordena las filas que superaron esos pasos. Es la última cláusula antes de LIMIT.

Un ejemplo básico

Esto selecciona nombres y edades y ordena los clientes más mayores primero:

<?php

$conn = new mysqli("localhost", "username", "password", "database");
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT name, age FROM customers ORDER BY age DESC";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
        echo "Name: " . $row["name"] . " - Age: " . $row["age"] . "<br>";
    }
} else {
    echo "0 results";
}

$conn->close();
?>

Nos conectamos con la clase mysqli, seleccionamos name y age de customers y usamos ORDER BY age DESC para que la mayor edad aparezca primero. Cambia DESC por ASC (o elimínalo) para poner al más joven primero.

Ordenar por varias columnas

Cuando varias filas comparten el mismo valor en la primera columna de ordenación, la siguiente columna desempata. El orden de las columnas en la cláusula es el orden de precedencia:

SELECT name, country, age
FROM customers
ORDER BY country ASC, age DESC;

Esto agrupa los clientes por country en orden alfabético y, dentro de cada país, lista al más mayor primero. Con los datos siguientes:

nombrepaísedad
AnnaCanada41
BenCanada29
CarlaMexico50

ORDER BY country ASC, age DESC devuelve Anna, Ben, Carla — Canada antes que Mexico, y Anna antes que Ben porque 41 > 29.

Cómo se ordenan los valores NULL

En MySQL, NULL se trata como menor que cualquier valor no NULL:

  • Con ASC, las filas donde la columna de ordenación es NULL aparecen primero.
  • Con DESC, aparecen al final.

Para forzar que los NULL queden al final independientemente de la dirección, ordena primero por si la columna es nula:

SELECT name, last_login
FROM users
ORDER BY last_login IS NULL, last_login DESC;

last_login IS NULL evalúa a 0 para fechas reales y a 1 para nulos, por lo que las filas no nulas (0) vienen antes que las nulas (1).

Ordenar por una columna elegida en tiempo de ejecución (de forma segura)

Una necesidad habitual es dejar que el usuario elija la columna de ordenación — por ejemplo ?sort=name. No puedes vincular un nombre de columna ni la palabra clave ASC/DESC con un marcador de posición de sentencia preparada; los marcadores solo funcionan para valores. Concatenar la petición sin procesar en el SQL sería una vulnerabilidad de inyección SQL. En cambio, valida la entrada contra una lista de valores permitidos:

<?php
// Map user input to known-good column names.
$allowedColumns = [
    "name" => "name",
    "age"  => "age",
    "date" => "created_at",
];

$sortKey   = $_GET["sort"] ?? "name";
$column    = $allowedColumns[$sortKey] ?? "name";          // fallback if unknown
$direction = (($_GET["dir"] ?? "asc") === "desc") ? "DESC" : "ASC";

// $column and $direction can now only be values we put in the code.
$sql = "SELECT name, age FROM customers ORDER BY $column $direction";
$result = $conn->query($sql);
?>

El usuario solo proporciona una clave del array; el nombre real de la columna y la dirección provienen de constantes en tu código, por lo que la entrada no confiable nunca llega a la cadena de consulta. Este es el único lugar donde construir SQL mediante concatenación es aceptable — porque cada valor posible es uno que tú has escrito.

Nota: ORDER BY en sí mismo nunca toma valores del usuario, por lo que no usa parámetros vinculados. Los valores de WHERE en la misma consulta deben seguir vinculándose con una sentencia preparada.

Errores comunes

  • Ordenar por una columna de cadena con números (por ejemplo, una age almacenada como VARCHAR) ordena léxicamente: "10" viene antes que "9". Almacena los números en una columna numérica o usa un cast con ORDER BY CAST(age AS UNSIGNED).
  • ORDER BY con LIMIT es la forma de obtener los "N mejores" resultados: ORDER BY age DESC LIMIT 5 devuelve los cinco más mayores. Sin ORDER BY, las filas que LIMIT conserva son impredecibles. Consulta limitar datos.
  • Ordenar un conjunto de resultados grande puede ser lento si ningún índice cubre la columna de ordenación; un índice en la columna de ORDER BY permite a MySQL omitir el paso de ordenación.

Conclusión

ORDER BY convierte un orden de filas indefinido en uno definido. Recuerda los aspectos esenciales: ASC es el valor predeterminado, las columnas se aplican de izquierda a derecha para desempatar, NULL ordena bajo y una columna de ordenación elegida por el usuario debe validarse contra una lista de valores permitidos en lugar de concatenarse a ciegas. Combinado con WHERE para filtrar y LIMIT para paginar, te da control total sobre qué filas devuelves y en qué orden.

Práctica

Práctica
¿Cuál es el propósito de la instrucción ORDER BY en MySQL según se describe en el sitio web?
¿Cuál es el propósito de la instrucción ORDER BY en MySQL según se describe en el sitio web?
Was this page helpful?