MySQL 5 左连接未知列
Posted
技术标签:
【中文标题】MySQL 5 左连接未知列【英文标题】:MySQL 5 left join unknown column 【发布时间】:2011-02-18 17:28:20 【问题描述】:我在 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('on 子句'中的未知列'e.email')
【问题讨论】:
【参考方案1】:您只能在ON
子句中引用以前使用JOIN
子句连接的表。
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
的来源:这就是它无法解析的原因。
【讨论】:
引号是指括号吗?在第一个查询中,我不明白您的解释。你指的是哪个on子句?你能重新措辞吗?谢谢【参考方案2】:答案是将 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
【讨论】:
谢谢。这对我有用,而且用额外的“JOIN ON”重写整个查询要容易得多。 是的,事实证明这是一个更简单的应用解决方案【参考方案3】:来自MySQL documentation page
以前,逗号运算符 (,) 和 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' in '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 混合的语句,所有这些现在都比逗号运算符具有更高的优先级。
【讨论】:
绝对正确,谢谢! 在向 FROM 子句添加新表后,我的查询突然中断,括号解决方案完美运行!这似乎是 MySQL 中一个非常烦人的变化,但我相信他们有充分的理由。以上是关于MySQL 5 左连接未知列的主要内容,如果未能解决你的问题,请参考以下文章