2015-07-10 4 views
6

Недавно я задал аналогичный вопрос примерно две недели назад, но я не видел, чтобы моя проблема работала так, как мне это нужно.Почему мой запрос возвращает неверные результаты?

У меня есть запрос, который выбирает из 2 таблиц; билеты и ответы. Я выбираю информацию из таблицы билета, и я выбираю информацию из таблицы ответов, в которой хранится идентификатор билета. Что теперь приходит к моей проблеме.

В моем запросе отображаются только те, у которых есть более 0 ответов, но мне нужно, чтобы они отображали информацию о билете, даже если у нее нет ответов.

Я хотел бы узнать (если возможно), если есть какой-либо способ исправить мою проблему, и если есть способ сделать его более простым, чем в настоящее время.

Сейчас это немного грязно, но вот мой код для запроса и отображения билетов и ответов.

if(isset($_GET['id']) && is_numeric($_GET['id'])) { 
    $id = trim($_GET['id']); 
    $i = ""; 

    $ticket = $db->conn->query(" 
           SELECT * FROM tickets 
           INNER JOIN replies ON tickets.id = '$id'") or die(mysqli_error($db->conn)); 

    while($rows = $ticket->fetch_assoc()) { 
     $i++; 
     if($_SESSION['ticket_username'] == $rows['client']) { 
      if($i <= 1) { 
       $status = $rows['status']; 
       echo ' 
        <h3>'.$rows['subject'].'</h3><hr> 

        <div class="panel panel-danger"> 
        <div class="panel-heading"> 
         <h3 class="panel-title"><small>Created by '.$rows['client'].', '.$timeAgo->inWords($rows['created_at']).'</small></h3> 
        </div> 
        <div class="panel-body">'.nl2br($rows['message']).'</div> 
        </div> 
       '; 
      } 

      echo ' 
       <div class="panel panel-info"> 
        <div class="panel-heading"> 
         <h3 class="panel-title"><small>Reply from '.$rows['reply_username'].', '.$timeAgo->inWords($rows['reply_time']).'</small></h3> 
        </div> 
        <div class="panel-body">'.nl2br($rows['reply_message']).'</div> 
        </div> 
       '; 

     } else { 
      header("Location: index"); 
     } 
    } 
} else { 
    header("Location: index"); 
} 
+0

Вы могли бы просто решить ее разделяющая запросы. Сначала заберите все билеты. Пройдите через билеты и получите все ответы за каждый билет. – Peter

+0

Я сделал что-то похожее на предыдущий проект, но на этот раз я хотел объединить его в один запрос. – Jon

ответ

14

Изменить запрос.

Используйте LEFT JOIN вместо INNER JOIN

$ticket = $db->conn->query("SELECT * FROM tickets 
LEFT JOIN replies ON tickets.id = '$id'") or die(mysqli_error($db->conn)); 

enter image description here

Пояснение:

  1. Inner Регистрация возвращает только те значения для обеих таблиц получить матч. Это своего рода пересечение двух кругов.
  2. Left Join возвращает все строки из левой таблицы, независимо от того, имеет ли он соответствующее соответствие на правом столе.

В вашем случае, если вы используете внутреннее соединение, оно возвращает только те билеты, у которых есть ответы.

Изображение Приглашение от here

+0

Я использовал LEFT JOIN в предыдущей попытке, но получил тот же результат. Просто изменил его на LEFT JOIN и добавил предложение WHERE и получил результат, который мне нужен. Спасибо. – Jon

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