2012-01-18 81 views
6

我想建立一个酒店预订系统。对于这个系统;数据库也被用于来回的其他程序......但我有问题:在预订前,我想看看哪个房间的号码类型可供我为我保留..酒店预订系统Sql查询?

我的表创建SQL querys

CREATE TABLE oteldb.oda (
oda_id INT (11) NOT NULL auto_increment, 
oda_tip_id INT (11) DEFAULT NULL, 
oda_adi VARCHAR (20) DEFAULT NULL, 
PRIMARY KEY (oda_id) 
) 
ENGINE = MyISAM 
AUTO_INCREMENT = 1 
CHARACTER SET utf8 
COLLATE utf8_general_ci; 

CREATE TABLE oteldb.tip (
tip_id INT (11) NOT NULL auto_increment, 
tip_adi VARCHAR (20) DEFAULT NULL, 
PRIMARY KEY (tip_id) 
) 
ENGINE = MyISAM 
AUTO_INCREMENT = 1 
CHARACTER SET utf8 
COLLATE utf8_general_ci 
ROW_FORMAT = FIXED; 

CREATE TABLE oteldb.rezervasyon (
rezervasyon_id INT (11) NOT NULL auto_increment, 
rezervasyon_gt DATE DEFAULT NULL, 
rezervasyon_ct DATE DEFAULT NULL, 
rezervasyon_oda_id INT (11) DEFAULT NULL, 
PRIMARY KEY (rezervasyon_id) 
) 
ENGINE = MyISAM 
AUTO_INCREMENT = 1 
CHARACTER SET utf8 
COLLATE utf8_general_ci; 

我试试这个,但现在

SELECT 
* 
FROM 
oteldb.tip 
WHERE 
IN tip.tip_id 
(SELECT 
oteldb.oda.oda_tip_id 
FROM 
oteldb.oda 
WHERE 
IN oda.oda_id note 

(SELECT 
oteldb.rezervasyon.rezervasyon_oda_id 
FROM 
oteldb.rezervasyon 
WHERE 
"2012-01-03" BETWEEN AND rezervasyon_ct rezervasyon_gt 
AND "2012-01-22" AND BETWEEN rezervasyon_gt rezervasyon_ct)) 

感谢不行......

+0

'凡在tip.tip_id'应该是'WHERE tip.tip_id IN ' – 2012-01-18 16:16:54

+2

+1包括DDL。 – 2012-01-18 16:27:02

+0

thanx弗洛林Ghita&马克班尼斯特,我试过但结果是不正确的,也不能显示房间的数量。我tihnk我的查询是错误的... – Mehmet 2012-01-18 16:29:58

回答

2

假设可用客房是那些在任何时候在查询期间已保留,并且rezervasyon_gt和rezervasyon_ct是分别预约开始日期和结束日期,请尝试:

select t.tip_adi, count(oda.oda_tip_id) 
from oteldb.tip t 
left join (select oda_tip_id 
      from oteldb.oda o 
      where not exists 
       (select null 
       from oteldb.rezervasyon r 
       where r.rezervasyon_oda_id = o.oda_id and 
         r.rezervasyon_gt <= '2012-01-22' and 
         '2012-01-03' <= r.rezervasyon_ct) 
      ) oda on oda.oda_tip_id = t.tip_id 
group by t.tip_adi 
+0

感谢马克查询出现故障。 我的数据库结构和数据sql查询如下。谢谢您提前.. [Sql创建查询](http://verigrup.net/oteldb.txt) 我转换英文 – Mehmet 2012-01-18 20:24:38

+1

@Mehmet:使用您的测试数据,我试着在本地运行我的查询,并意识到我应该选择'count(oda.oda_tip_id)',而不是'count(*)'。我已经相应地修改了我的查询 - 修改后的查询似乎与测试数据正常工作。 – 2012-01-19 11:23:40

+0

感谢马克,我再次尝试查询,但它也显示预订时间已被询问的预约房间。 我向你发送英文[sql table](http://verigrup.net/hotel.txt)中的sql图表链接。例如 例如2012,01,03和2012.01.22之间有5个空间。它不应该在“类型”列表中的“类型”中显示占用的房间。也就是说,如果8个房间中的5个房间在“type_id”= 1中被占用,则应该记录3个房间的“type_id”= 1。 – Mehmet 2012-01-19 18:37:35

0
select 
     RoomType.tip_adi, 
     sum(if(Rooms.oda_id = BookedRooms.rezervasyon_oda_id, 0, 1) as AvailableCount 
    from 
     oteldb.oda Rooms 

     LEFT JOIN (select distinct 
          res.rezervasyon_oda_id 
         from 
          oteldb.rezervasyo res 
         where 
           res.rezervasyon_gt between '2012-01-22' and '2012-01-03' 
          OR res.rezervasyon_ct between '2012-01-22' and '2012-01-03' 
        ) BookedRooms 
      on Rooms.oda_id = BookedRooms.rezervasyon_oda_id 

     JOIN oteldb.tip RoomType 
      on Rooms.oda_tip_id = RoomType.tip_id 
+0

DRapp谢谢,在查询中输入错误。 :/ 1您的SQL语法有错误;请检查与您的MySQL服务器版本相对应的手册,以便在第3行Query1处使用'((Rooms.oda_id = BookedRooms.rezervasyon_oda_id,0,1))'作为AvailableCount''附近的正确语法'QueryMeq 3 7 – Mehmet 2012-01-19 18:45:19

+0

@Mehmet,从IF(条件,真实答案,错误答案)更改为Case/when条件。 – DRapp 2012-01-19 19:24:31

+0

:/ 1您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在sum处使用正确的语法(在第1行查询Rooms.oda_id = BookedRooms.rezervasyon_oda_id th时的情况)Query1.qry 1 37 – Mehmet 2012-01-20 22:16:27