我正在寻找一些帮助,以便最好地构建MySQL查询并显示结果。我正在尝试在PHP页面上创建一个表,其中顶部有7个日期,侧面有房间号。在表格中,如果某人在指定日期在某个房间内,则会显示其姓名。我有以下表格:
表:房间
字段: ID,房间
表:预订
字段: ID,姓名,房间,签到,结帐
我目前的代码是:
<? $start = date('Y-m-d');
$end = date('Y-m-d', strtotime($start." + 6 day")); ?>
<table class="table1">
<thead>
<tr>
<th></th>
<th scope="col"><?= date('d-m', strtotime($start)); ?></th>
<th scope="col"><?= date('d-m', strtotime($start." + 1 day")); ?></th>
<th scope="col"><?= date('d-m', strtotime($start." + 2 day")); ?></th>
<th scope="col"><?= date('d-m', strtotime($start." + 3 day")); ?></th>
<th scope="col"><?= date('d-m', strtotime($start." + 4 day")); ?></th>
<th scope="col"><?= date('d-m', strtotime($start." + 5 day")); ?></th>
<th scope="col"><?= date('d-m', strtotime($start." + 6 day")); ?></th>
</tr>
</thead>
<tbody>
<? $q1 = mysqli_query($con,"SELECT * FROM rooms GROUP BY room");
while($row1 = mysqli_fetch_assoc($q1)){ ?>
<tr>
<th><?= $row1['room']; ?></th>
<? $i = 0;
while ($i <= 6) { ?>
<td>
<? $q2 = mysqli_query($con,"SELECT * FROM bookings WHERE ((checkin BETWEEN '$start' and '$end') or (checkout BETWEEN '$start' and '$end') or (checkin <= '$start' AND checkout >= '$end')) and room = '$row1[room]'");
while($row2 = mysqli_fetch_assoc($q2)){
if ($row2['checkout'] > date('Y-m-d', strtotime($start." + ".$i." day")) and $row2['checkin'] <= date('Y-m-d', strtotime($start." + ".$i." day"))) {
echo $row2['name'];
}
} ?>
</td>
<? ++$i;
} ?>
</tr>
<? } ?>
</tbody>
</table>
此代码目前产生我需要的结果,但我担心它的效率低,因为它运行的循环和查询量很大。
有人可以建议更好的格式化查询/结果的方法吗?
答案 0 :(得分:0)
我认为where
子句中你想要的逻辑是:
checkin <= '$end' AND checkout >= '$start' and room = '$row1[room]'
当检查在结束日期之前且结账时间在开始日期之后,两个日期之间会占用一个房间。
编辑:
你有的条款是:
checkin <= '$start' AND checkout >= '$end'
这与我的解决方案不同。