我有一个主表,其中存储有多个级别的项目,父母和子项,并且还有一个第二个表可能有也可能没有其他数据.我需要从我的主表中查询两个级别,并在第二个表中添加一个左侧的连接,但是由于我的查询中的排序将不起作用.
SELECT something FROM master as parent,master as child LEFT JOIN second as parentdata ON parent.secondary_id = parentdata.id LEFT JOIN second as childdata ON child.secondary_id = childdata.id WHERE parent.id = child.parent_id AND parent.parent_id = 'rootID'
左连接只适用于from子句中的最后一个表,所以我只能使其在左连接之一工作.在上面的例子中,左连接不会工作,因为第一个左连接指向from子句中的第一个表,第二个连接将永远不会这样工作.
我该怎么做这个工作?
解决方法
这种查询应该工作 – 在用现代ANSI JOIN语法重写之后:
SELECT something FROM master parent JOIN master child ON child.parent_id = parent.id LEFT JOIN second parentdata ON parentdata.id = parent.secondary_id LEFT JOIN second childdata ON childdata.id = child.secondary_id WHERE parent.parent_id = 'rootID'
这里的跳线是明确的JOIN在“旧样式”CROSS JOIN之前用逗号(,)绑定. I quote the manual here:
In any case
JOIN
binds more tightly than the commas separating
FROM
-list items.
重写第一个后,所有连接都将从左到右应用,它可以正常工作.
只是为了说明这一点,这也可以起作用:
SELECT something FROM master parent LEFT JOIN second parentdata ON parentdata.id = parent.secondary_id,master child LEFT JOIN second childdata ON childdata.id = child.secondary_id WHERE child.parent_id = parent.id AND parent.parent_id = 'rootID'
但是,通常优选显式的JOIN语法,如您的例子所示.