问题描述
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行:...程序c左联接照片p ON p.referencekey = i.key在哪里...
提示:表\“ i \”有一个条目,但是不能从查询的这一部分中引用它。
解决方法
由于您的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
, 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中修复了此问题,并且该查询也将不再在那里工作。
, 将JOIN
语句移到要加入的表旁边:
SELECT
i.*,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
详细的解释:
ѭ5是表达式的一部分,该表达式生成源表,在in8ѭ子句中用作from_item。您的FROM
子句具有3个from_item源表:
items
rooms
categories
加入了photos
错误在于您的categories
与photos
from_item中的ON
join_condition。您引用的表items
在from_item中不存在。解决方案是将photos
连接移到items
from_item中,以便您具有以下from_item源表:
items
加入了photos
rooms
categories
遗憾的是,我在文档中找不到一个示例来阐明FROM
子句中的表与JOIN
之间的关系。 ѭ26概要说明了此语法,并且是找到此区别的文档中的最佳来源。请注意,ѭ5不是FROM
的兄弟子句,而是实际上FROM
子句中from_item的一部分。因此,如果您的“ 8”子句包含一个表列表,则该列表中的每个表都可以具有自己的联接。这样就变得更加直观,联接中涉及的每个表都必须包含在单个from_item中。