2014-02-16 3 views
0

Я ищу некоторую помощь в том, как лучше структурировать запрос MySQL и отображать результаты. Я пытаюсь создать таблицу на странице PHP, которая имеет 7 дат в верхней части и номера комнаты сбоку. В таблице, если человек находится в комнате на указанную дату, появляется их имя. У меня есть следующие таблицы:Структурирование MySQL-запроса эффективно

Таблица: номера
Поля: идентификатор, номер

Таблица: заказы
Поля: идентификатор, имя, номер, к регистрационным, Кассовые

Код, который у меня есть сейчас:

<? $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

Возможно, у вас есть запрос Google для mysql –

+0

Помните, что время является линейным, поэтому вас интересует только время, когда x_start является y_start! – Strawberry

ответ

0

Я думаю, что логика вы хотите в пункте where является:

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

Комната занята между двумя датами, когда проверка является до даты окончания и выписка после даты начала.

EDIT:

Предложение у вас есть:

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

Это отличается от моего решения.

+0

Привет, Гордон. Я думаю, что у меня уже есть это предложение в моем втором запросе (q2). Проблема в том, что если есть 20 комнат, это означает, что 140 запросов необходимо запустить для отображения информации. Это то, что я пытаюсь уменьшить/сделать более эффективным, если это возможно? Благодарю. – mckeegan375

Смежные вопросы