MySQL 5 оставил присоединиться к неизвестному столбцу - PullRequest
11 голосов
/ 12 мая 2010

У меня был следующий запрос, работающий в MySQL 4.1, но не в 5.0:

SELECT * FROM email e, event_email ee 
LEFT JOIN member m on m.email=e.email 
WHERE ee.email_id = e.email_id

Ошибка: 1054 (Неизвестный столбец «e.email» в «on оговорке»)

Ответы [ 3 ]

17 голосов
/ 12 мая 2010

Вы можете ссылаться только на таблицы, ранее объединенные с предложением JOIN в предложении ON.

SELECT  *
FROM    email e
JOIN    event_email ee 
ON      ee.email_id = e.email_id
LEFT JOIN
        member m
ON      m.email = e.email 

Это можно проиллюстрировать лучше, если я поставлю кавычки вокруг ANSI JOINS в исходном запросе:

SELECT  *
FROM    email e,
        (
        event_email ee
        LEFT JOIN
                member m
        ON      m.email = e.email 
        )
WHERE   ee.email_id = e.email_id

Как видите, внутри кавычек нет источника для e.email: поэтому его невозможно разрешить.

3 голосов
/ 31 января 2016

С Страница документации MySQL

Ранее операторы запятой (,) и JOIN имели одинаковый приоритет, поэтому выражение соединения t1, t2 JOIN t3 интерпретировалось как ((t1, t2) JOIN t3). Теперь JOIN имеет более высокий приоритет, поэтому выражение интерпретируется как (t1, (t2 JOIN t3)). Это изменение влияет на операторы, использующие предложение ON, потому что это предложение может ссылаться только на столбцы в операндах соединения, а изменение в приоритете меняет интерпретацию того, чем являются эти операнды.

Пример:

CREATE TABLE t1 (i1 INT, j1 INT);
CREATE TABLE t2 (i2 INT, j2 INT);
CREATE TABLE t3 (i3 INT, j3 INT);

SELECT * FROM t1, t2 JOIN t3 ON (t1.i1 = t3.i3);

Ранее SELECT был допустимым из-за неявной группировки t1, t2 как (t1, t2). Теперь JOIN имеет приоритет, поэтому операндами для предложения ON являются t2 и t3. Поскольку t1.i1 не является столбцом ни в одном из операндов, результатом будет ошибка Unknown column 't1.i1' в 'on clause'. Чтобы разрешить обработку объединения, сгруппируйте первые две таблицы явно в круглых скобках, чтобы операндами для предложения ON были (t1, t2) и t3:

SELECT * FROM (t1, t2) JOIN t3 ON (t1.i1 = t3.i3);

В качестве альтернативы, избегайте использования оператора запятой и используйте вместо этого JOIN:

SELECT * FROM t1 JOIN t2 JOIN t3 ON (t1.i1 = t3.i3);

Это изменение также применяется к операторам, которые смешивают оператор запятой с INNER JOIN, CROSS JOIN, LEFT JOIN и RIGHT JOIN, причем все они имеют более высокий приоритет, чем оператор запятой.

1 голос
/ 10 января 2018

Ответом будет размещение оператора JOIN непосредственно после таблицы в операторе FROM, потому что это таблица, к которой вы присоединяетесь:

SELECT * 
FROM email e 
LEFT JOIN member m on m.email=e.email, 
event_email ee 
WHERE ee.email_id = e.email_id
...