我在尋找如何最好地安排一個MySQL查詢並顯示結果一些幫助。我正在嘗試在PHP頁面上創建一個表格,其中頂部有7個日期,下方有個房間號碼。在表中,如果某人在指定日期的房間內,則會出現他們的姓名。我有以下表格:構建MySQL查詢效率
表:客房
領域: 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>
此代碼目前生產的結果,但是我需要,我很擔心,這是因爲循環和查詢的運行來獲取數據量的低效率。
任何人都可以提出格式化的查詢/結果的更好的辦法?
從學習SQL JOINS開始 –
可能要爲mysql數據透視查詢獲得谷歌 –
請記住,時間是線性的,所以您只對x_start y_start時間感興趣。 –
Strawberry