GUÍA COMPLETA DE LATERAL JOIN EN MYSQL
LATERAL JOIN es una de las características más potentes introducidas en MySQL 8.0.14. Permite que una subconsulta en la cláusula "FROM" haga referencia a columnas de las tablas anteriores del "JOIN", habilitando patrones de consulta muy complejos y eficientes.
b>LATERAL, indica que la subconsulta puede acceder a valores de las filas de la consulta exteriorSin LATERAL, la subconsulta en "FROM" se ejecuta de forma independiente y usando LATERAL, se ejecuta una vez por cada fila de la tabla anterior, como si fuera una función.
Sintaxis básica
SELECT
FROM tabla_principal p
JOIN LATERAL (
SELECT ...
FROM tabla_secundaria s
WHERE s.columna = p.id-- ← referencia a la tabla anterior
) AS sub ON true;
Ejemplo 1: Los 3 productos más vendidos por categoría
CREATE TABLE categorias (
id INT PRIMARY KEY,
nombre VARCHAR(100)
);
CREATE TABLE productos (
id INT PRIMARY KEY,
categoria_id INT,
nombre VARCHAR(100),
ventas INT
);
-- Consulta con LATERAL
SELECT
c.nombre AS categoria,
p.nombre AS producto,
p.ventas
FROM categorias c
JOIN LATERAL (
SELECT nombre, ventas
FROM productos p2
WHERE p2.categoria_id = c.id
ORDER BY ventas DESC
LIMIT 3
) p ON true
ORDER BY c.nombre, p.ventas DESC;
Este patrón es extremadamente útil y mucho más legible que las soluciones antiguas con variables de usuario o consultas complejas.
Ejemplo 2: Último pedido de cada cliente
SELECT c.nombre, c.email, ultimo_pedido.fecha, ultimo_pedido.total,ultimo_pedido.estado
FROM clientes c
JOIN LATERAL (
SELECT fecha, total, estado, id
FROM pedidos p
WHERE p.cliente_id = c.id
ORDER BY fecha DESC
LIMIT 1
) ultimo_pedido ON true
WHERE c.activo = 1;Ejemplo 3: Usando CROSS JOIN LATERAL (equivalente a JOIN LATERAL con ON TRUE)
SELECT e.nombre AS empleado,t.fecha, t.total
FROM empleados e
CROSS JOIN LATERAL (
SELECT fecha, total
FROM transacciones t
WHERE t.empleado_id = e.id
ORDER BY fecha DESC
LIMIT 5
) t;Con LATERAL o Sin LATERAL
| Enfoque | Ventajas | Desventajas |
|---|---|---|
| Subconsulta correlacionada en SELECT | Sencilla | No puede devolver múltiples filas/columnas fácilmente |
| LATERAL JOIN | Muy potente, legible, devuelve múltiples filas | Requiere MySQL 8.0.14+ |
| Window Functions (ROW_NUMBER) | Eficiente | Más complicado para ciertos casos |
Cuándo usar LATERAL JOIN
- Obtener los "Top N" por grupo
- Traer el último registro de una tabla relacionada
- Realizar cálculos complejos por fila que necesiten subconsultas
- Desnormalizar datos de forma dinámica
- Reemplazar funciones de tabla o procedimientos complejos
Consideraciones de rendimiento
LATERAL suele ser muy eficiente cuando:
- Hay buenos índices en las columnas de unión
- Se usa "LIMIT" dentro de la subconsulta
- La cardinalidad no es demasiado alta