有效地构建MySQL查询

时间:2014-02-16 14:28:50

标签: php mysql performance html-table

我正在寻找一些帮助,以便最好地构建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>

此代码目前产生我需要的结果,但我担心它的效率低,因为它运行的循环和查询量很大。

有人可以建议更好的格式化查询/结果的方法吗?

1 个答案:

答案 0 :(得分:0)

我认为where子句中你想要的逻辑是:

checkin <= '$end' AND checkout >= '$start' and room = '$row1[room]'

当检查在结束日期之前且结账时间在开始日期之后,两个日期之间会占用一个房间。

编辑:

你有的条款是:

checkin <= '$start' AND checkout >= '$end'

这与我的解决方案不同。