酒店预订系统Sql查询?

酒店预订系统Sql查询?,sql,Sql,我想建立一个酒店预订系统。对于该系统;数据库也用于其他程序。。。但我有个问题:在预订之前,我想看看我预订的房间类型有多少 我的表创建sql查询 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 AUT

我想建立一个酒店预订系统。对于该系统;数据库也用于其他程序。。。但我有个问题:在预订之前,我想看看我预订的房间类型有多少

我的表创建sql查询

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;
我试过了,但没用

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))

现在谢谢…

假设可用房间是查询期间任何时候都没有预订的房间,并且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

tip.tip_id中的WHERE应该是thanx Florin Ghita&Mark Bannister中的WHERE tip.tip_id,我尝试过,但结果不正确,也无法显示房间数。我怀疑我的查询是错误的…@Mehmet:你能提供一些样本数据吗?谢谢,标记查询有问题。我的数据库结构和数据sql查询如下。先谢谢你。。我皈依了English@Mehmet:使用您的测试数据,我尝试在本地运行查询,并意识到我应该选择countoda.oda\u tip\u id,而不是count*。我已经相应地修改了我的查询-修改后的查询似乎与测试数据一起正常工作。谢谢标记,我再次尝试了查询,但它也显示了已请求的预订时间日期中的预订房间。我给你发送英文的sql图表链接。例如,2012年1月3日至2012年1月22日期间,共有5间客房被占用。它不应在类型列表中显示该类型中已占用的房间。也就是说,如果8个房间中的5个房间被类型_id=1占用,那么它应该占到类型_id=1的3个房间。@Mehmet:在您修改的数据中,只有4个房间是类型1勒克斯,只有一个id为2的房间,名称100被预订。另外3间为2类普通客房,其中只有一间为id为3、名称为200的客房,在相关期间预订了两次。另外两个房间为3类Eco,其中只有一个房间的id为1,名称为300,在相关期间预订了三次。因此,在预订期间,type 1 Lux有3间可用房间,type 2 Normal有2间可用房间,type 3 Eco有1间可用房间-这就是查询返回的结果。@Mehmet:这正是查询的工作方式,与我运行查询得到的结果完全相同请参见前面的注释。如果您在运行查询时得到不同的结果,请将其包括在内。谢谢,请在查询中键入内容。:/1您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以了解在第3行Query1.qry 3“if Rooms.oda_id=BookedRooms.rezervasyon_oda_id,0,1 as AvailableCount”附近使用的正确语法7@Mehmet,将IFcondition、true-answer、false-answer更改为Case/when条件。:/1您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解可在第1行Query1.qry 1中使用的接近“sum case when Rooms.oda_id=BookedRooms.rezervasyon_oda_id th”的正确语法37@Mehmet,明白了。。。我的眼睛错过了。。。我在第一个字段后面没有逗号,在最后一个字段后面有一个额外的逗号,但是在FROM子句doooohh!!!:不管怎样,我把它放回总和如果。。。
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))
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
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