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 左连接未知列的主要内容,如果未能解决你的问题,请参考以下文章

mysql命令总结

如何使 React Table 中的某些列左对齐和某些列居中对齐 - React

mysql优化5表左连接

5 左连接导致查询超时,mysql 5.5

图解MySQL 内连接外连接左连接右连接全连接

MySQL左连接不返回连接表的空值