"FROM" 部分中多个表的 LEFT JOIN

LEFT JOIN on multiple tables in "FROM" part

我无法在 Whosebug 上找到确切的示例,所以这是我的问题。在 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

这部分抛出一个错误 "Unknown column 'member.staff_id' in 'on clause'"。我要如何更改才能使 5.x 不会抱怨?

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

的问题

您的修改很有帮助。 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 子句中移出一些条件。

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

13.2.8.2 JOIN Syntax

However, the precedence of the comma operator is less than of INNER JOIN, CROSS JOIN, LEFT JOIN, and so on. If you mix comma joins with the other join types when there is a join condition, an error of the form Unknown column 'col_name' in 'on clause' may occur.

你现在遇到这个错误的原因是(来自同一个 link)

Previously, the comma operator (,) and JOIN both had the same precedence.

要绕过此操作顺序限制,您可以仅使用显式连接语法重写查询,也可以通过用括号将逗号分隔 table 括起来来强制对它们进行分组,这将让 MySQL 看到你的 table 更像这样 ( (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