2015-04-17 65 views
1

我收到一个错误,试图访问子查询的子查询中选定的字段。它说“未知列在哪里”。我有其他的子查询以及使用相同的字段,他们完美地工作。这个问题似乎只发生在我尝试访问子查询中的子查询中的字段时。无法访问字段多个子查询深

我的查询

SELECT r.id, 
(SELECT min(begindatum) 
    FROM ((SELECT begindatum FROM reservatiekamer 
     WHERE reservatieId = r.id) UNION 
     (SELECT begindatum FROM reservatiefaciliteit 
     WHERE reservatieId = r.id)) as bg) 
as begindatum 
FROM reservatie r 

错误

#1054 - Unknown column 'r.id' in 'where clause' 

背景故事的简化版本,我想选择房间的多个保留​​的存在保留的开始日期和设施(2个不同的桌子)。

+0

您的意思是'从reservatie AS r'? – Huey

+0

在MySQL中不是可选的吗? – jarlh

+0

AS在MySQL中确实是可选的。我在我的完整查询中的许多地方使用“r”,除了在子查询的子查询中,它不会导致任何问题。 – Wouter

回答

1

如果子查询始终只返回一个值,你可以使用least()

SELECT r.id, 
     least((SELECT begindatum FROM reservatiekamer WHERE reservatieId = r.id), 
      (SELECT begindatum FROM reservatiefaciliteit WHERE reservatieId = r.id) 
      ) as begindatum 
FROM reservatie r; 

其实,这种变化将更好地工作:

SELECT r.id, 
     least(COALESCE((SELECT MIN(begindatum) FROM reservatiekamer WHERE reservatieId = r.id), 0), 
      COALESCE((SELECT MIN(begindatum) FROM reservatiefaciliteit WHERE reservatieId = r.id), 0) 
      ) as begindatum 
FROM reservatie r; 

这假定值始终为正,这这就是为什么0在那里。另一个值可能更合适。

最后,您可以将逻辑移动到from条款:

SELECT r.id, 
     LEAST(COALESCE(rk.minbd, rf.minbd), COALESCE(rf.minbd, rk.minbd)) as begindatum 
FROM reservatie r LEFT JOIN 
    (SELECT reservatieId, MIN(begindatum) as minbd 
     FROM reservatiekamer 
     GROUP BY reservatieId 
    ) rk 
    ON r.id = rk.reservatieId LEFT JOIN 
    (SELECT reservatieId, MIN(begindatum) as minbd 
     FROM reservatiefaciliteit 
     GROUP BY reservatieId 
    ) rf 
    ON r.id = rf.reservatieId; 

coalesce()least()打算返回一个值,如果对方是NULL

+0

第一个和第三个查询给我一个错误。第二个没有给我我需要的结果,在15条记录中,其中13条有“0”作为开端,只有2条有实际的日期。 – Wouter

+0

第一个查询出错:#1242 - 子查询返回多于一行 第三个查询出错:#1064 - 您的SQL语法错误; – Wouter