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 exterior

Sin 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
Se recomienda analizar las consultan que usan LATERAL con EXPLAIN para verificar que MySQL use los índices correctamente.<