我的联接返回0结果

时间:2014-08-27 12:45:24

标签: mysql sql

我必须遵循3个表:房间,预订和预订室

他们的结构如下:

CREATE TABLE `room` (
  `roomID` int(11) NOT NULL AUTO_INCREMENT,
  `hotelID` int(11) NOT NULL,
  `roomtypeID` int(11) NOT NULL,
  `roomNumber` int(11) NOT NULL,
  `roomName` varchar(255) NOT NULL,
  `roomName_en` varchar(255) NOT NULL,
  `roomDescription` text,
  `roomDescription_en` text,
  `roomSorder` int(11) NOT NULL,
  `roomVisible` tinyint(4) NOT NULL,
  PRIMARY KEY (`roomID`)
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8;


CREATE TABLE `reservation` (
   `reservationID` int(11) NOT NULL AUTO_INCREMENT,
   `customerID` int(11) NOT NULL,
   `hotelID` int(11) NOT NULL,
   `reservationCreatedOn` datetime NOT NULL,
   `reservationCreatedFromIp` varchar(255) CHARACTER SET greek NOT NULL,
   `reservationNumberOfAdults` tinyint(4) NOT NULL,
   `reservationNumberOfChildrens` tinyint(4) NOT NULL,
   `reservationArrivalDate` date NOT NULL,
   `reservationDepartureDate` date NOT NULL,
   `reservationCustomerComment` text CHARACTER SET greek,
   PRIMARY KEY (`reservationID`)
) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8;

CREATE TABLE `reservationroom` (
   `reservationroomID` int(11) NOT NULL AUTO_INCREMENT,
   `reservationID` int(11) NOT NULL,
   `hotelID` int(11) NOT NULL,
   `roomID` int(11) NOT NULL,
  PRIMARY KEY (`reservationroomID`)
) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8;

(请注意,为简单起见,已从create语句中删除了外键)

我想做的事情:我希望所有房间都没有为特定日期预留,这只是特定酒店的免费房间(我有它的身份证)

以下是我现在的查询:

SELECT r.* FROM room r  
LEFT JOIN `reservationroom` rr 
ON r.`hotelID` = rr.`hotelID` 
AND r.`roomID` = rr.`roomID`
LEFT JOIN `reservation` re
ON rr.`reservationID` = re.`reservationID`
WHERE (rr.`reservationroomID` = '' 
    OR rr.`reservationroomID` IS  NULL 
    AND re.`reservationArrivalDate` >= 2014-08-27
    AND re.`reservationDepartureDate` <= 2014-08-29 
    AND r.`hotelID` = 10 
    AND r.`roomVisible` = 1);

此查询现在返回0结果。它应该返回9条记录,因为ID = 10的酒店有9个免费的房间(预订表中没有特定日期的重新安排)

有人可以帮我一把吗?我试图在几个小时内解决这个问题,没有任何成功。

1 个答案:

答案 0 :(得分:0)

您正在使用left join,因此除了第一个表之外的所有条件都应该在on子句中。我想你想要一个更像这样的查询:

SELECT r.*
FROM room r LEFT JOIN
    `reservationroom` rr 
     ON r.`hotelID` = rr.`hotelID` AND
        r.`roomID` = rr.`roomID` LEFT JOIN
    `reservation` re
      ON rr.`reservationID` = re.`reservationID` AND
         re.`reservationArrivalDate` >= 2014-08-27 AND
         re.`reservationDepartureDate` <= 2014-08-29 
WHERE r.`hotelID` = 10 AND r.`roomVisible` = 1 AND re.reservationID is null;

我不确定与空字符串的比较是什么。这似乎没有必要。