如果联接表不包含行,则在MySQL中联接表将返回NULL

时间:2018-09-18 18:40:17

标签: mysql join

这是我的表格结构:

___房间

|--------|-------------|
| ROO_Id | ROO_HotelId |
|--------|-------------|
|      1 |      ABC123 |
|      2 |      ABC123 |
|      3 |      ABC123 |
|--------|-------------|

___订阅

|-------------|-----------|
| SUB_HotelId | SUB_Limit |
|-------------|-----------|
|      ABC123 |        19 |
|      XYZ987 |        23 |
|-------------|-----------|

___Rooms具有所需的HotelId的行时,此查询有效。

SELECT 
    COUNT(ROO_Id) AS SUB_RoomNumber, 
    SUB_Limit 
FROM ___Subscriptions 
LEFT JOIN ___Rooms 
    ON ___Rooms.ROO_HotelId = ___Subscriptions.SUB_HotelId 
WHERE SUB_HotelId = 'ABC123'
    AND ROO_HotelId = 'ABC123'

|----------------|-----------|
| SUB_RoomNumber | SUB_Limit |
|----------------|-----------|
|              3 |        19 |
|----------------|-----------|

对于旅馆XYZ987,该旅馆实际上在___Rooms中没有房间,并且查询返回SUB_Limit的我为NULL:

|----------------|-----------|
| SUB_RoomNumber | SUB_Limit |
|----------------|-----------|
|              0 |      NULL |
|----------------|-----------|

为什么请?

1 个答案:

答案 0 :(得分:0)

请勿在位置条件内检查ROO_HotelId = 'XYZ987'。如果ROO_HotelId表中没有匹配的__Rooms,则不会显示任何数据(如果使用Where)。

基本上,一旦完成了在表之间的Join(在HotelId上),则只需要为其中一个表放置Where条件。对于内部联接,可以使用任何一个表。但是,对于左连接,您需要使用左表。

使用以下内容:

SELECT 
    COUNT(ROO_Id) AS SUB_RoomNumber, 
    SUB_Limit 
FROM ___Subscriptions 
LEFT JOIN ___Rooms 
    ON ___Rooms.ROO_HotelId = ___Subscriptions.SUB_HotelId 
WHERE SUB_HotelId = 'XYZ987'