Ошибка 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

 

Никаких мыслей по поводу “1054 Unknown column 'table1.id' in 'on clause'”