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
执行上述查询时返回以下错误。
错误:对表"的FROM子句项的引用无效;i〃;
第1行:。。。tegory c LEFT JOIN照片p ON p.referencekey=i.key WHER。。。
提示:有一个表"的条目;i〃;,但不能从查询的这一部分引用它。
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
是一个显式联接,并且首先运行。注意,在这一点上,表别名为i,因为我还没有被查看,所以它还不能被连接。请注意,MySQL在5.2中修复了这种行为,我相信这个查询也将不再工作。
将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
错误出现在categories
从_item加入photos
的ON
join_condition中。您引用的表items
不存在于from_item中。解决方案是将photos
联接从_item移动到items
,这样您就有了以下from_item源表:
items
加入photos
rooms
categories
遗憾的是,我在文档中找不到一个例子来阐明FROM
子句中的表和JOIN
之间的关系。SELECT
概要显示了这种语法,是文档中找到这种区别的最佳来源。请注意,JOIN
不是FROM
的同级子句,而是FROM
子句中from_item的一部分。因此,如果FROM
子句由一个表列表组成,那么该列表中的每个表都可以有自己的联接。然后,更直观的是,联接中涉及的每个表都必须包含在一个from_item中。
既然你的Items.Room=Rooms.Key,我就把它作为where。。
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