我从mysql连接查询得到错误的结果

时间:2014-09-17 13:50:36

标签: mysql join

我有2张桌子,我想加入,一张是房间,另一张是预订。

基本上我想搜索未预订的房间(不在预订表中),并从房间表中获取这些房间的详细信息(不在预订表中)。

以下是我的表结构:

 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=47 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=47 DEFAULT CHARSET=utf8;

这是我现在的查询,这给了我错误的结果:

SELECT * FROM room r 
LEFT JOIN reservation re
ON r.hotelID = re.hotelID
WHERE re.hotelID = 13
AND NOT 
(re.reservationArrivalDate >= '2014-07-07' AND  re.reservationDepartureDate <= '2014-07-13')

我也创造了一个小提琴,两个表中的数据包括: http://sqlfiddle.com/#!2/4bb9ea/1

任何帮助都将深受赞赏

问候,约翰

2 个答案:

答案 0 :(得分:0)

我同意错过了房间号码, 但查询模板应该看起来像

SELECT 
  * 
FROM
  room r 
  LEFT JOIN reservation re 
    ON r.hotelID = re.hotelID 
WHERE r.hotelID = 2 
  AND NOT (
    re.hotelID IS NOT NULL 
    AND re.reservationArrivalDate >= '2014-07-07' 
    AND re.reservationDepartureDate <= '2014-09-23'
  ) ;

您需要在预订到房间的声明中更改表格。此外,您还需要将re.hotelID添加到where语句,因为在where语句中,您需要在尝试检查日期后检查该记录是否为空

答案 1 :(得分:0)

鉴于新添加的reservationroom表,请考虑使用NOT EXISTS子查询来查找没有预订的会议室:

SELECT
 *
FROM
 room r
WHERE NOT EXISTS
 (SELECT 
   *
  FROM 
   reservationroom rr
 WHERE 
   rr.reservationroomID = r.roomID
 )