首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL 5左联接未知列

MySQL 5左联接未知列
EN

Stack Overflow用户
提问于 2010-05-13 00:19:20
回答 3查看 19.2K关注 0票数 13

我在mysql 4.1中使用了以下查询,但在5.0中不能:

代码语言:javascript
复制
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’)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-05-13 00:22:52

您只能引用以前在ON子句中使用JOIN子句联接的表。

代码语言:javascript
复制
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括起来,这一点可以更好地说明:

代码语言:javascript
复制
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的源代码:这就是无法解析它的原因。

票数 18
EN

Stack Overflow用户

发布于 2016-01-31 19:27:09

来自MySQL documentation page

以前,逗号运算符(,)和JOIN具有相同的优先级,因此join表达式t1,t2 JOIN t3被解释为((t1,t2) JOIN t3)。现在JOIN具有更高的优先级,因此表达式被解释为(t1,(t2 JOIN t3))。此更改会影响使用ON子句的语句,因为该子句只能引用联接操作数中的列,而优先级的更改会更改对这些操作数的解释。

示例:

代码语言:javascript
复制
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);

以前,由于t1,t2 as (t1,t2)的隐式分组,SELECT是合法的。现在联接优先,所以ON子句的操作数是t2和t3。由于t1.i1不是这两个操作数中的列,因此结果是'on子句‘错误中的未知列't1.i1’。要允许处理联接,请使用括号显式地对前两个表进行分组,以便ON子句的操作数为(t1,t2)和t3:

代码语言:javascript
复制
SELECT * FROM (t1, t2) JOIN t3 ON (t1.i1 = t3.i3);

或者,避免使用逗号运算符,而使用JOIN:

代码语言:javascript
复制
SELECT * FROM t1 JOIN t2 JOIN t3 ON (t1.i1 = t3.i3);

此更改也适用于将逗号运算符与内部联接、交叉联接、左联接和右联接混合在一起的语句,所有这些语句现在的优先级都高于逗号运算符。

票数 5
EN

Stack Overflow用户

发布于 2018-01-10 22:38:55

答案是将JOIN语句直接放在FROM语句中的表后,因为这是您要连接的表:

代码语言:javascript
复制
SELECT * 
FROM email e 
LEFT JOIN member m on m.email=e.email, 
event_email ee 
WHERE ee.email_id = e.email_id
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2820724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档