Saltar al contenido

Mi LEFT JOIN se comporta como INNER JOIN y no sé por qué

MajoByte

Nivel 3 ·

Quiero todos los clientes, tengan o no pedidos este año: SELECT c.nombre, p.id FROM clientes c LEFT JOIN pedidos p ON p.cliente_id = c.id WHERE p.fecha >= '2024-01-01'; Pero me salen solo los que tienen pedidos. Los que no tienen desaparecen.
933 vistas 5 respuestas 0 0

Respuestas 5

  1. Gabriela H.

    Nivel 3 ·

    0 0

    El WHERE se aplica después del JOIN. Para los clientes sin pedidos, p.fecha es NULL, y NULL >= '2024-01-01' no es verdadero, así que el WHERE los descarta.

  2. Benjamín R.

    Nivel 3 ·

    0 1

    Solución: mové la condición al ON. SELECT c.nombre, p.id FROM clientes c LEFT JOIN pedidos p ON p.cliente_id = c.id AND p.fecha >= '2024-01-01';

  3. Gabriel B.

    Nivel 3 ·

    0 0

    Regla mental: las condiciones sobre la tabla de la derecha de un LEFT JOIN van en el ON, salvo que quieras filtrar a propósito (por ejemplo WHERE p.id IS NULL para ver los que NO tienen pedidos).

  4. MajoByte

    Nivel 3 ·

    0 0

    Funcionó! No tenía idea de que el ON y el WHERE se comportaban distinto en un LEFT JOIN.

  5. antonella F.

    Nivel 2 ·

    0 0

    En un INNER JOIN da lo mismo ponerlo en el ON o en el WHERE, por eso nadie se da cuenta hasta que usa LEFT.