2015-07-10 228 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

相关问题