我有两个桌子:
___Rooms
:
|--------|------------|
| ROO_Id | ROO_Status |
|--------|------------|
| 47 | active |
| 48 | active |
| 49 | active |
|--------|------------|
___Availabilities
:
|--------|------------|------------|------------|
| AVA_Id | AVA_RoomId | AVA_Date | AVA_Status |
|--------|------------|------------|------------|
| 1 | 47 | 2019-02-25 | Open |
| 2 | 48 | 2019-02-26 | Open |
| 4 | 47 | 2019-02-28 | Close |
| 5 | 47 | 2019-02-25 | Open |
|--------|------------|------------|------------|
我想获取这两个表在一定日期范围内的信息。
所以我的查询如下:
SELECT ROO_Id, AVA_Id, AVA_Date, AVA_Status
FROM ___Rooms
LEFT JOIN ___Availabilities
ON ___Rooms.ROO_Id = ___Availabilities.AVA_RoomId
WHERE ROO_Status!="inactive"
AND AVA_Date BETWEEN "2019-02-24" AND "2019-03-10"
ORDER BY ROO_Id ASC
问题是查询没有占用所有___Rooms
行。例如,Room #49
在___Availabilities
中没有记录,但是我需要在最终结果中保留它。
你知道为什么吗?
谢谢。
答案 0 :(得分:1)
使用左联接是正确的,但是通过过滤where
子句中的AVA_Date列,您将排除AVA_Date为null的任何行。
将过滤器移至on
子句,您的左联接将按预期工作
SELECT ROO_Id, AVA_Id, AVA_Date, AVA_Status
FROM ___Rooms
LEFT JOIN ___Availabilities
ON ___Rooms.ROO_Id = ___Availabilities.AVA_RoomId
AND AVA_Date BETWEEN "2019-02-24" AND "2019-03-10"
WHERE ROO_Status!="inactive"
ORDER BY ROO_Id ASC