2017-09-23 62 views
-1

我有一个家庭作业数据库,用于存储酒店预订。如何显示一次当前状态?

我必须根据日期检查预约。

例如:

2017年6月14日

查询返回房间号,并打印出的可用性。

$selectedDay = $_POST['selectedDay']; 
$select_date = "SELECT DISTINCT * FROM events WHERE '$selectedDay' BETWEEN start AND end - INTERVAL 1 DAY"; 
$result = mysqli_query($connection, $select_date); 
echo "<h2>Free rooms in this date: <br/> $selectedDay</h2>"; 
if (mysqli_num_rows($result) > 0) { 

    While ($row = mysqli_fetch_array($result)) { 
     echo "<h3>" . $row['name'] . "</h3>"; 
     for ($i = 1; $i < 20; $i++) { 
      if ($row['room' . $i] == '1') { 
       echo "Room " . $i . ": <span style='color:red;'>busy</span> <br />"; 
      } else { 
       echo "Room " . $i . ": <span style='color:green;'>free/span> <br />"; 
      } 
     } 
    } 
} else { 
    echo "No data for this date."; 
} 

我想要ONE房间的总体列表,现在如果在选定日期有3位客人,列表将被打印3次。

图片表: https://ibb.co/jBVcik

+1

您需要重构您的数据库设计。有一张桌子和房间'ID,房间'。然后为客人准备一张桌子:'身份证,姓名,电子邮件等......'。然后你可以有第三张桌子连接客人和房间。我们称它为预订:'id,guest_id,room_id,check_in,check_out'。现在,您可以使用一些简单的连接轻松获取各种列表。 –

+0

和这个表吗?这是不可能的? –

+0

如果您遍历结果并重新构造PHP中的数据,则可以_can_。因为它是作业,所以试着从一开始就学习并正确地做。学习方法不重要。:-) –

回答

0

我想你现在找到自己的解决方案。万一你仍然inetested在已经做在SQL查询的工作方案,看看这个:

SELECT group_concat(name) names, count(CASE room1 WHEN '1' THEN 1 END) r1, count(CASE room2 WHEN '1' THEN 1 END) r2, 
    count(CASE room3 WHEN '1' THEN 1 END) r3, count(CASE room4 WHEN '1' THEN 1 END) r4, count(CASE room5 WHEN '1' THEN 1 END) r5, 
    count(CASE room6 WHEN '1' THEN 1 END) r6, count(CASE room7 WHEN '1' THEN 1 END) r7, count(CASE room8 WHEN '1' THEN 1 END) r8, 
    count(CASE room9 WHEN '1' THEN 1 END) r9, count(CASE room10 WHEN '1' THEN 1 END) r10,count(CASE room11 WHEN '1' THEN 1 END) r11, 
    count(CASE room12 WHEN '1' THEN 1 END) r12, count(CASE room13 WHEN '1' THEN 1 END) r13, count(CASE room14 WHEN '1' THEN 1 END) r14 
FROM tbl where '20170823' between start and enddt-interval 1 day 

它导致这样的事情

names    r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 
Charlie,Sally,Patty 0 1 2 0 0 0 0 0 0 0 0 0 0 0 

你可以玩与它周围的位置:(我用MySQL的特定功能group_concat()也显示的当前所选择的日期的所有客人的名字)http://rextester.com/HNDA58846

如果你想与结果表(预约日期序列)结束了,你可以稍微改变它

SELECT dt, 
    group_concat(name) names, count(CASE room1 WHEN '1' THEN 1 END) r1, count(CASE room2 WHEN '1' THEN 1 END) r2, 
    count(CASE room3 WHEN '1' THEN 1 END) r3, count(CASE room4 WHEN '1' THEN 1 END) r4, count(CASE room5 WHEN '1' THEN 1 END) r5, 
    count(CASE room6 WHEN '1' THEN 1 END) r6, count(CASE room7 WHEN '1' THEN 1 END) r7, count(CASE room8 WHEN '1' THEN 1 END) r8, 
    count(CASE room9 WHEN '1' THEN 1 END) r9, count(CASE room10 WHEN '1' THEN 1 END) r10,count(CASE room11 WHEN '1' THEN 1 END) r11, 
    count(CASE room12 WHEN '1' THEN 1 END) r12, count(CASE room13 WHEN '1' THEN 1 END) r13, count(CASE room14 WHEN '1' THEN 1 END) r14 
FROM tbl 
INNER JOIN (SELECT '20170823' dt UNION ALL SELECT '20170824' UNION ALL SELECT '20170825') dates 
    ON dt between start and enddt-interval 1 day 
GROUP BY dt 

WHERE条款更改为子查询的ON条款和dt正在从拉加入子查询(或者如果你愿意的话,也可以是其他表)。结果:

dt   names    r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 
20170823 Sally,Charlie,Patty 0 1 2 0 0 0 0 0 0 0 0 0 0 0 
20170824 Sally,Charlie,Patty 0 1 2 0 0 0 0 0 0 0 0 0 0 0 
20170825 Sally,Patty   0 1 1 0 0 0 0 0 0 0 0 0 0 0 

如果你碰巧有您的数据库中理货表,一个简单的表,连续的数字是这样的:

id 
--- 
1 
2 
3 
4 
. 
.. 
50 

,你可以做一个INNER JOIN用它来获得,当有人所有日期实际上是在你的房间一个

... 
LEFT JOIN (SELECT CAST('20170801' as date)+ interval id day dt FROM tally) dates 
... 

RIGHT JOIN,如果你想克服的概述一定的日期范围与全部它的房间(空或不)。

相关问题