Mat*_*lor 55 mysql sql mysql-error-1054
我有以下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
Run Code Online (Sandbox Code Playgroud)
我收到这个错误:
#1054 - 'on子句'中的未知列'p.id'
据我所知,查询看起来正确,任何想法可能是错的?
Mar*_*ers 98
不要混用ANSI-89样式和ANSI-92样式的连接.它们具有不同的优先级,可能导致混淆错误,这就是这里发生的事情.您的查询解释如下:
FROM property p, (
propertygeometry pg
JOIN shortlist sl ON sl.PropertyID = p.id AND sl.MemberID = 384216
...
)
Run Code Online (Sandbox Code Playgroud)
在上面,在考虑逗号样式连接之前,首先计算使用JOIN关键字的连接.此时该表p尚未声明.
从MySQL手册:
但是,逗号运算符的优先级小于INNER JOIN,CROSS JOIN,LEFT JOIN等.如果在存在连接条件时将逗号连接与其他连接类型混合,则可能会出现'on子句'中未知列'col_name'形式的错误.有关处理此问题的信息将在本节后面给出.
我建议始终使用ANSI-92样式连接,即使用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
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
Run Code Online (Sandbox Code Playgroud)
有关:
Tom*_*ins 10
如前所述,通过逗号运算符使用连接存在优先级问题,其中将执行LEFT JOIN,因此此时不存在对表别名的引用.虽然您可以通过该语句隐式告诉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
Run Code Online (Sandbox Code Playgroud)
请注意,逗号分隔的表包含在括号()中.表别名和列现在可供您的其他JOIN使用.
| 归档时间: |
|
| 查看次数: |
70178 次 |
| 最近记录: |