两个表之间的联接不会返回表之间没有链接的行

时间:2019-02-24 23:46:06

标签: php mysql sql

我有两个桌子:

___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中没有记录,但是我需要在最终结果中保留它。

你知道为什么吗?

谢谢。

1 个答案:

答案 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