2013-10-23 72 views
5

我在JOIN语句中放置了一个相当简单的子查询。它只适用于在子查询选择中包含*的情况。为什么?MySQL左加入子查询使用*

这工作

$sql = 'SELECT locations.id, title, name, hours.lobby 
     FROM locations 
     LEFT JOIN states ON states.id = locations.state_id 
     LEFT JOIN (SELECT *, type_id IS NOT NULL AS lobby FROM location_hours) AS hours ON locations.id = hours.location_id 
     GROUP BY locations.id'; 

这不

$sql = 'SELECT locations.id, title, name, hours.lobby 
     FROM locations 
     LEFT JOIN states ON states.id = locations.state_id 
     LEFT JOIN (SELECT type_id IS NOT NULL AS lobby FROM location_hours) AS hours ON locations.id = hours.location_id 
     GROUP BY locations.id'; 

应我甚至可以做这种方式?如果你不需要所有的领域,我认为*是不是最好的?

回答

20

试试这个(如果我理解正确的话你的意图,你想对TYPE_ID不空滤):

$sql = 'SELECT locations.id, title, name, hours.lobby 
     FROM locations 
     LEFT JOIN states ON states.id = locations.state_id 
     LEFT JOIN (SELECT location_id, type_id AS lobby FROM location_hours 
     WHERE type_id IS NOT NULL) AS hours ON locations.id = hours.location_id 
     GROUP BY locations.id'; 

的解释是,你必须在内部查询并选择其中引用的所有领域在外部查询中。

+1

当您仅从子查询中选择一个字段时,您的问题是您无法执行联接语句,因为如果您仅选择了type_id,则子查询不提供hours.location_id。 – Ashalynd

+0

这是有道理的。我猜想很明显。无论如何,这工作。谢谢。 – MAZUMA

+0

另外检查你是否真的需要使用(在第二种情况下)左连接而不是JOIN。如果你不想NULL type_id,那么我假设你可能真的想运行一个JOIN(通常更快)。 – Ashalynd

0

由于您希望type_id具有非NULL值,因此根本不应该使用LEFT JOIN。您需要以下内容,它使用标准的JOIN。

$sql = 'SELECT locations.id, title, name, location_hours.type_id 
     FROM locations 
     JOIN location_hours ON location_hours.location_id = locations.id 
     LEFT JOIN states ON states.id = locations.state_id 
     WHERE location_hours.type_id IS NOT NULL 
     GROUP BY locations.id'; 

JOIN的整点是它只加入实际存在的行。所以你不会得到任何行location_hours没有一个相应的location_id locations.id。然后,您只需过滤掉location_hours.type_id的空值。

+0

如果我只运行一个连接它的位置行。我想要所有的位置行。然后我想看看是否已经为这些位置设置了小时数,以查看是否存在NULL值。 – MAZUMA

+0

我不确定我是否明白你的意思。你能重述吗? 顺便说一句,你的LEFT JOIN不工作的原因是因为子查询没有选择location_id,而是你将它用于ON条件。 – Chill

+0

如果我运行JOIN,它会排除不存在小时type_id的行。我想要获取所有位置行,然后查看每个位置是否有type_id的值。我使用该值来确定是否需要为特定位置添加或编辑小时。 – MAZUMA