2014-02-16 125 views
0

我在尋找如何最好地安排一個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> 

此代碼目前生產的結果,但是我需要,我很擔心,這是因爲循環和查詢的運行來獲取數據量的低效率。

任何人都可以提出格式化的查詢/結果的更好的辦法?

+1

從學習SQL JOINS開始 –

+0

可能要爲mysql數據透視查詢獲得谷歌 –

+0

請記住,時間是線性的,所以您只對x_start y_start時間感興趣。 – Strawberry

回答

0

我想你了where子句中需要的邏輯是:

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

一個房間是兩個日期之間所佔據時,檢查是結束日期前結帳是開始日期之後。

編輯:

你擁有的條款是:

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

這是我的解決方案不同。

+0

嗨戈登。我想我已經在我的第二個查詢(q2)中有這個子句。問題是,如果有20個房間,則意味着需要運行140個查詢來顯示信息。如果可能的話,我正試圖減少/提高效率?謝謝。 – mckeegan375