15-05-2026

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