SELECT
i.*,
r.name AS roomname,
c.name AS cat,
p.key AS imgkey,
p.extension AS imgext
FROM
items i,
rooms r,
categories c
LEFT JOIN photos p
ON p.referencekey = i.key
WHERE
i.room = r.key
AND r.key = 663308
AND i.sitekey = 32201
AND c.key = i.categorykey
执行时的上述查询会返回以下错误。
错误:对表“i”的FROM子句条目的无效引用
第1行:... tegory c LEFT JOIN photos p ON p.referencekey = i.key WHER ...
提示:表“i”有一个条目,但不能从查询的这一部分引用它。
答案 0 :(得分:30)
SQL规范声明在隐式连接之前执行显式连接。这是一个隐式连接:
FROM table1 t1, table2 t2 WHERE t1.id=t2.t1id
这是一个明确的联接:
FROM table1 t1 JOIN table2 t2 ON (t1.id=t2.t1id)
此代码位:
categories c
LEFT JOIN photos p
ON p.referencekey = i.key
是显式连接,首先运行。请注意,此时表格别名,因为我尚未查看,因此它尚未加入。请注意,我认为MySQL在5.2中修复了这种行为,并且此查询将不再适用于此。
答案 1 :(得分:16)
将您的JOIN
语句移到您要加入的表旁边:
SELECT
i.*,
r.name AS roomname,
c.name AS cat,
p.key AS imgkey,
p.extension AS imgext
FROM
items i
LEFT JOIN photos p
ON p.referencekey = i.key,
rooms r,
categories c
WHERE
i.room = r.key
AND r.key = 663308
AND i.sitekey = 32201
AND c.key = i.categorykey
长篇解释:
JOIN
是导致源表的表达式的一部分,在FROM
子句中用作from_item。您的FROM
子句有3个 from_item 源表:
items
rooms
categories
已加入photos
错误发生在ON
加入categories
from_item 的photos
join_condition 中。您正在引用 from_item 中不存在的表items
。解决方案是将photos
联接移动到items
from_item ,以便您拥有以下 from_item 源表:
items
已加入photos
rooms
categories
可悲的是,我在文档中找不到一个示例,该示例清楚地表明FROM
子句中的表与JOIN
之间的关系。 SELECT
Synopsis显示了这种语法,是文档中找到这种区别的最佳来源。请注意,JOIN
不是FROM
的兄弟条款,但实际上是FROM
子句中 from_item 的一部分。因此,如果您的FROM
子句由表列表组成,则该列表中的每个表都可以有自己的连接。然后,更加直观的是,连接中涉及的每个表必须包含在单个 from_item 中。
答案 2 :(得分:12)
由于你的Items.Room = Rooms.Key,我只想把它作为那里..
SELECT
i.*,
r.name AS roomname,
c.name AS cat,
p.key AS imgkey,
p.extension AS imgext
FROM
items i
LEFT JOIN photos p
ON p.referencekey = i.key
JOIN rooms r
on i.room = r.key
JOIN categories c
on i.categorykey = c.key
WHERE
i.sitekey = 32201
AND i.room = 663308