使用多个联接的未知列

cetgtptt  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(262)

我想把两张table连在一起两次。一个有不同的行,另一个时间有不同的行,但我得到下面的错误,


# 1054 - Unknown column 'p1.ID' in 'on clause'

mysql数据库:

SELECT p1.ID, p1.post_title, p1.post_excerpt, p2.meta_value, p1.guid, p4.guid
FROM wp_posts AS p1, wp_postmeta AS p3
    INNER JOIN wp_postmeta p2
        ON p1.ID = p2.post_id 
        AND p2.meta_key = '_price'
        AND p1.post_type = 'product'
        AND p1.post_status = 'publish'
    INNER JOIN wp_posts p4
        ON p4.ID = p3.post_id 
        AND p3.meta_key = '_thumbnail_id'
        AND p4.post_type = 'attachment'

编辑:下面是我在回答后的查询,但它给了我一个空表。

SELECT p1.ID, p1.post_title, p1.post_excerpt, p2.meta_value, p1.guid, p3.guid
FROM wp_posts p1 
     JOIN wp_postmeta p2
     ON p1.ID = p2.post_id AND
        p2.meta_key = '_price' AND
        p1.post_type = 'product' AND
        p1.post_status = 'publish' 
     JOIN wp_posts p3
     ON p3.ID = p2.post_id AND 
        p2.meta_key = '_thumbnail_id' 
     JOIN wp_postmeta p4
     ON p4.post_id = p3.ID AND
        p3.post_type = 'attachment';
j2cgzkjk

j2cgzkjk1#

1054-“on子句”中的未知列“p1.id”

根据连接语法文档:
join的优先级高于逗号运算符(,),因此join表达式t1,t2 join t3被解释为(t1,(t2 join t3)),而不是((t1,t2)join t3)。这会影响使用on子句的语句,因为该子句只能引用联接操作数中的列,并且优先级会影响对这些操作数的解释。
例子:

SELECT * FROM t1, t2 JOIN t3 ON (t1.i1 = t3.i3);

联接优先于逗号运算符,因此on子句的操作数是t2和t3。由于t1.i1不是任一操作数中的列,因此结果是“on子句”错误中的未知列“t1.i1”。
因此,相应地更改join子句并构建sql语句。

koaltpgm

koaltpgm2#

不要在句子中使用逗号 FROM 条款。始终使用显式 JOIN 语法。你的问题是一个范围问题,很容易解决。
当你这么做的时候,你会注意到 p3 似乎缺少连接条件 id 或者 post_id . 这是所需查询的结构:

SELECT p1.ID, p1.post_title, p1.post_excerpt, p2.meta_value, p1.guid, p4.guid
FROM wp_posts p1 JOIN
     wp_postmeta p2
     ON p1.ID = p2.post_id AND
        p2.meta_key = '_price' AND
        p1.post_type = 'product' AND
        p1.post_status = 'publish' JOIN
     wp_posts p3
     ON p3.? = p2.? AND  -- What join condition do you intend here?
        p3.meta_key = '_thumbnail_id' JOIN
     wp_postmeta p4
     ON p4.ID = p2.post_id AND
        p4.post_type = 'attachment';

相关问题