2015-07-10 229 views
6

我最近在兩週前問了一個類似的問題,但我沒有看到讓我的問題按照我需要的方式工作。爲什麼我的查詢返回不正確的結果?

我有一個查詢是從2個表中選擇;門票和回覆。我從票據表中選擇信息,然後從存儲票據ID的答覆表中選擇信息。現在來解決我的問題。

我的查詢只顯示有超過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. 內部聯接僅返回這兩個表的值獲得 比賽。這是一個兩圓圈的交集。
  2. 左連接返回左表中的所有行,而不管它在右表上是否有任何匹配,而不管它們是 。

就你而言,如果你使用inner join,它只返回那些有回覆的票。

圖片推薦自here

+0

我在前面的嘗試中使用了LEFT JOIN,但得到了相同的結果。現在只要將它改爲LEFT JOIN並添加了WHERE子句並獲得了我所追求的結果。謝謝。 – Jon

相關問題