MySQL左连接子查询*

时间:2013-10-23 23:07:44

标签: mysql select subquery left-join

我在JOIN语句中使用子查询组合了一个相当简单的查询。它仅在我在子查询select中包含*时才有效。为什么呢?

这有效

$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';

我应该这样做吗?如果你不需要所有的领域,我认为*不是最好的?

2 个答案:

答案 0 :(得分:31)

尝试这个(如果我理解你的意图正确,你想在type_id上​​过滤非null):

$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 :(得分: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的NULL值。