将LEFT JOIN与GROUP BY组合在一起,同时还包括NULL

时间:2012-06-14 10:58:12

标签: mysql sql group-by left-join

我在使用LEFT JOIN和GROUP BY组合具有一对多映射的表时遇到了问题。

我有下表带有唯一ID(在说明性示例中,这是house_number)

房屋:

|house_number| bedrooms|
|0           | 4       |
|1           | 3       |
|2           | 1       |

我想要使用唯一ID来使用第二个表来LEFT JOIN,其中第二个表可能有也可能没有每个唯一ID的多个条目。 E.g,

乘员:

| house_number | occupant_id | type    |
| 0            | 3           | 19      |
| 0            | 1           | 20      |
| 0            | 2           | 21      |
| 2            | 7           | 20      |

现在我想要实现的是每个门牌号码只有一个条目,但是在LEFT JOIN中优先考虑类型为20的占用者,同时还保留那些没有列出任何占用者的房屋,例如

|house_number| bedrooms| occupant_id | type    |
|0           | 4       | 1           | 20      |
|1           | 3       | null        | null    |
|2           | 1       | 7           | 20      |

我可以使用GROUP BY来实现每个房子只有一个条目,但是,我需要确保随其返回的占用者行(如果存在)具有type = 20

如果我只使用WHERE (type = 20),那么我就不会为house_number = 1返回一个条目。

我如何才能进入决赛桌?

2 个答案:

答案 0 :(得分:2)

尝试WHERE (type = 20 OR type is null)条件呢?

答案 1 :(得分:2)

SELECT h.house_number,h.bedrooms
        , o.occupant_id,o.ztype
FROM houses h
LEFT JOIN occupants o ON h.house_number = o.house_number
        AND o.ztype =20
        ;

BTW我必须更换"键入" by" ztype"因为类型是Postgres中的保留字。