混合显式联接和隐式联接失败;表..有一个条目..但是它不能从查询的这一部分引用"


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加入photosONjoin_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 

最新更新