代码之家  ›  专栏  ›  技术社区  ›  Matthew James Taylor

ON子句中的MySQL未知列

  •  54
  • Matthew James Taylor  · 技术社区  · 16 年前

    我有以下MySQL查询:

    SELECT p.*,
        IF(COUNT(ms.PropertyID) > 0,1,0) AS Contacted,
        pm.MediaID,
        date_format(p.AvailableFrom, '%d %b %Y') AS 'AvailableFrom',
        astext(pg.Geometry) AS Geometry
    FROM property p, propertygeometry pg
        JOIN shortlist sl ON sl.PropertyID = p.id AND sl.MemberID = 384216
        LEFT JOIN message ms ON ms.PropertyID = p.id AND ms.SenderID = 384216
        LEFT JOIN property_media pm ON pm.PropertyID = p.id AND pm.IsPrimary = 1
    WHERE p.paused = 0
        AND p.PropertyGeometryID = pg.id
    GROUP BY p.id
    

    我得到了这个错误:

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

    3 回复  |  直到 16 年前
        1
  •  98
  •   Community Mohan Dere    9 年前

    不要混合使用ANSI-89样式和ANSI-92样式的连接。它们具有不同的优先级,这可能导致混淆错误,这就是这里发生的情况。您的查询解释如下:

    FROM property p, (
        propertygeometry pg
        JOIN shortlist sl ON sl.PropertyID = p.id AND sl.MemberID = 384216
        ...
    )
    

    在上面,在考虑逗号样式的联接之前,首先计算使用JOIN关键字的联接。在那一点上,桌子 p

    从 MySQL manual :

    “on子句”中的列“col_name”未知

    我建议你 总是 使用ANSI-92样式的联接,即使用联接关键字:

    SELECT p.*,
        IF(COUNT(ms.PropertyID) > 0,1,0) AS Contacted,
        pm.MediaID,
        date_format(p.AvailableFrom, '%d %b %Y') AS 'AvailableFrom',
        astext(pg.Geometry) AS Geometry
    FROM property p
        JOIN propertygeometry pg ON p.PropertyGeometryID = pg.id
        JOIN shortlist sl ON sl.PropertyID = p.id AND sl.MemberID = 384216
        LEFT JOIN message ms ON ms.PropertyID = p.id AND ms.SenderID = 384216
        LEFT JOIN property_media pm ON pm.PropertyID = p.id AND pm.IsPrimary = 1
    WHERE p.paused = 0
    GROUP BY p.id
    

    相关:

        2
  •  10
  •   Tom Mulkins    11 年前

    如前所述,有一个优先问题,使用逗号运算符连接,其中将执行左连接,因此对表别名的引用在那时不会存在。尽管可以通过该语句隐式地告诉MySQL使用JOIN,但也可以告诉MySQL首先计算逗号连接的表,然后执行left JOIN:

    SELECT p.*,
    IF(COUNT(ms.PropertyID) > 0,1,0) AS Contacted,
    pm.MediaID,
    date_format(p.AvailableFrom, '%d %b %Y') AS 'AvailableFrom',
    astext(pg.Geometry) AS Geometry
    FROM (property p, propertygeometry pg)
    JOIN shortlist sl ON sl.PropertyID = p.id AND sl.MemberID = 384216
    LEFT JOIN message ms ON ms.PropertyID = p.id AND ms.SenderID = 384216
    LEFT JOIN property_media pm ON pm.PropertyID = p.id AND pm.IsPrimary = 1
    WHERE p.paused = 0
    AND p.PropertyGeometryID = pg.id
    GROUP BY p.id
    

        3
  •  1
  •   user742102    13 年前

    我遇到了这个错误未知列,差异在于查询是通过会话内的HQL生成的。executeQuery(“select id,name,sum(paid),cust type from cust group by brand”)这就是为什么必须手动键入inner join或join关键字不是一个选项,因为生成它的是HQL。 它生成如下查询sumthing:

    select cust_id, name, sum(paid), c.custTypeId
    from customer c, custType ct
    on c.custTypeId  = ct.custTypeId 
    

    它写着“未知的c.custTypeId”列,而我有101%的把握它有这个列。

    我的班级/关系:

    Customer {
    Integer custId
    CustomerType custType
    }
    
    CustomerType{
     Integer custTypeId
    string code
    }
    

    问题在于“fromcustomer,custType”行中的逗号。上面的答案应该是JOIN这个词。但是因为它是HQL并且正在生成,所以我不能这样做。我所做的是通过查询修改的,我键入的不是select custType select custType.id, custType.code

    我知道这是基本的,但对于像我这样的第一次,这是一场斗争。