1054 Unknown column 'table1.id' in 'on clause'
Ошибка 1054 MySQL Unknown column 'table1.id' in 'on clause' может произойти при написании, казалось бы, правильного запроса:
SELECT table1.content, table2.content1, table3.content3 FROM table1, table2 LEFT JOIN table3 ON table3.id_table1 = table1.id WHERE table1.id = 20 AND table2.id_table1 = table1.id
Переписав запрос так, чтобы table2 тоже присоединялась с помощью LEFT JOIN, ошибка 1054 "уходит":
SELECT table1.content, table2.content1, table3.content3 FROM table1 LEFT JOIN table2 ON table2.id_table1 = table1.id LEFT JOIN table3 ON table3.id_table1 = table1.id WHERE table1.id = 20
Второй SQL запрос практически аналогичен первому, за исключением того, что данные из table1 будут получены в не зависимости от того, есть ли необходимый id в table2, что не всегда приемлимо.
Побороть ошибку MySQL 1054 Unknown column 'table1.id' in 'on clause' возможно и без изменения логики запроса, просто заменив запятую во второй строке первого запроса (FROM table1, table2) на оператор JOIN: FROM table1 JOIN table2. В итоге, запрос к MySQL будет выглядеть так:
SELECT table1.content, table2.content1, table3.content3 FROM table1 JOIN table2 LEFT JOIN table3 ON table3.id_table1 = table1.id WHERE table1.id = 20 AND table2.id_table1 = table1.id
Ошибка Unknown column 'table1.id' in 'on clause' № 1054 после первого запроса возникала из-за того, что оператор запятая (а это именно оператор, аналогичный оператору JOIN), имеет меньший приоритет чем JOIN и LEFT JOIN. Из-за этого, к моменту запроса table1.id, данные table1 еще не были доступны: table2 уже прочитана, table1 еще нет.
Зная про приоритеты и причину возникновения ошибки 1054 Unknown column 'table1.id' in 'on clause', легко можно написать рабочий SQL запрос с оператором-запятой, просто заменив порядок подключения таблиц в FROM (c table1, table2 на table2, table1):
SELECT table1.content, table2.content1, table3.content3 FROM table2, table1 LEFT JOIN table3 ON table3.id_table1 = table1.id WHERE table1.id = 20 AND table2.id_table1 = table1.id