Posts Tagged: SQL


23
oct 08

Diferencias en uniones INNER JOIN en MySQL

Cuidado con utilizar y mezclar las cláusulas INNER JOIN / LEFT JOIN en MySQL con una lista de tablas en el FROM. Por ejemplo, un tipico SELECT:

1
2
3
4
SELECT *
    FROM tabla1 t1, tabla2 t2
    LEFT JOIN tabla3 t3 ON t3.id = t1.id
    WHERE t1.id = t2.id

Funcionaba bien hasta la versión 5.0.12 de MySQL. A partir de la versión 5.0.12, ha cambiado la precedencia de los operadores “coma” (,) y JOIN, de tal forma que se produce un error “Unknown column ‘t1.id’ in ‘on clause’”. Esto rompe de manera definitiva algunos programas, osCommerce por ejemplo.

La solución es poner paréntesis para forzar la precedencia de los operadores “coma” y JOIN, o también cambiar la coma por un INNER JOIN, de tal forma que el anterior query quedaría de la siguiente forma:

1
2
3
4
SELECT *
    FROM tabla1 t1
    INNER JOIN tabla2 t2 ON t2.id = t1.id
    LEFT JOIN tabla3 t3 ON t3.id = t1.id

O también:

1
2
3
4
SELECT *
    FROM (tabla1 t1, tabla2 t2)
    LEFT JOIN tabla3 t3 ON t3.id = t1.id
    WHERE t1.id = t2.id

Personalmente prefiero la primera, considero que es mucho más correcto ya que todas las uniones de las tablas se hacen directamente en cláusulas ON dejando el WHERE libre para las restricciones de los datos, no las uniones.