【问题标题】:LEFT JOIN on multiple tables in "FROM" part“FROM”部分中多个表的左连接
【发布时间】:2015-04-25 06:33:19
【问题描述】:

我无法在 stackoverflow 上找到确切的示例,所以这是我的问题。在 MySQL 4.x 中它工作正常,但 5.x 似乎不喜欢以下内容:

SELECT some stuff..    
FROM schools, member , applications
LEFT JOIN courses ON courses.id = applications.course_id 
LEFT JOIN staff ON staff.id=member.staff_id

此部分引发错误,提示“'on Clause' 中的未知列 'member.staff_id'”。如何更改此设置以使 5.x 不会抱怨?

编辑:我确实注意到,当使用'ONE' LEFT JOIN 时,表名放在FROM 部分中的位置确实很重要,即它必须位于末尾。不过,不确定这与问题有什么关系。这只是 5.x 的问题

【问题讨论】:

  • 您确定您正在测试的两个版本之间实际上具有相同的数据库架构吗?
  • 是的,完全一样。我已经注意到我之前编写的其他客户程序的这个问题(全部使用 MySQL 5.0>)
  • 这是您的全部查询吗?还是你把where 条款留在了那里?
  • 还有一个 where 子句,但它并没有解决这个问题。它只在学校表中添加了一些限制。
  • 这是我通常会删除部分查询的地方,直到错误消失以缩小范围。混合使用新旧式连接语法有点奇怪,但我认为这应该不是问题。

标签: mysql left-join multiple-columns


【解决方案1】:

根据MySQL官方文档,join运算符的优先级高于,(逗号)运算符。这将导致在没有member 表的情况下评估您的joins,这意味着memberjoin 中不可用。但是,因为applications 表是逗号分隔表系列中的最后一个表,所以它可用于连接。 MySQL 有效地看到这样的表:(schools, member, (applications left join courses ... ))

13.2.8.2 JOIN Syntax

但是,逗号运算符的优先级低于 INNER JOIN、CROSS JOIN、LEFT JOIN 等等。如果您将逗号连接与 当存在连接条件时,其他连接类型的错误 可能会出现“on 子句”中的表单未知列“col_name”。

您现在遇到此错误的原因是(来自同一链接)

以前,逗号运算符 (,) 和 JOIN 的优先级相同。

要解决此操作顺序限制,您可以仅使用显式连接语法重写查询,也可以通过用括号括起来强制对逗号分隔的表进行分组,这将使 MySQL 看到您的表更像这个( (schools, member, applications) left join courses ... )

SELECT some stuff..    
FROM (schools, member , applications)
LEFT JOIN courses ON courses.id = applications.course_id 
LEFT JOIN staff ON staff.id=member.staff_id

但我仍然建议使用显式连接语法。

select some stuff..
  from schools
    join member
    join applications
    left join courses on courses.id = applications.course_id
    left join staff on staff.id = member.staff_id

【讨论】:

  • 成功了,谢谢!为什么使用显式连接比添加括号更好?
【解决方案2】:

您的编辑有所帮助。 MySQL 似乎不喜欢您将旧式逗号分隔连接语法与较新的 ANSI SQL-92 连接语法混合在一起。

我会改写成

SELECT some stuff..    
FROM schools
  JOIN member ON (...)
  JOIN applications ON (...)
  LEFT JOIN courses ON courses.id = applications.course_id 
  LEFT JOIN staff ON staff.id=member.staff_id

您可能需要从 WHERE 子句中上移一些条件。

【讨论】:

    猜你喜欢
    • 2010-10-28
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 2012-03-13
    相关资源
    最近更新 更多