2015-06-23 24 views
0

我有两个MySQLi查询,我试图将其转换为一个连接查询。它在某种程度上工作,但它不能满足我的要求。加入查询不按照我想要的方式

我有2张桌子,门票和回复。我从票据查询中选择信息,并从票据ID存储在那里的答复表中选择信息。到目前为止,我正在输出初始票证信息和第一个答复,但它对于此票证的每个答复都重复此操作。所以我当前的输出是这样的:

Initial message 
First reply 
Initial message 
Second reply 
Initial message 
Third reply 

它输出该票证每个答复的初始消息。我只希望它输出一次初始消息,然后输出该票证的回复。到目前为止,我已经试过这样做连接查询的几个不同的方法,但是这是我现在所拥有的:

$ticket = $db->conn->query("SELECT tickets.client, tickets.subject, tickets.message, tickets.created_at, tickets.status, 
                replies.reply_username, replies.reply_message, replies.reply_time 
              FROM tickets, replies 
              WHERE tickets.id = replies.ticket_id") or die(mysqli_error($db->conn)); 

我做错什么了吗?我的逻辑在某个地方是错的吗?

我还想补充说,我的以前的查询有'内部连接'和'左连接',但内部给我我现在有相同的输出。

有点乱,但这是在查询后运行的代码。

while($rows = $ticket->fetch_object()) { 
    if($_SESSION['ticket_username'] == $rows->client) { 
     $status = $rows->status; 
     echo ' 
      <h3>'.$rows->subject.'</h3> 
      <small>Created by '.$rows->client.', '.$timeAgo->inWords($rows->created_at).'</small> 
      <hr> 
      <p>'.nl2br($rows->message).'</p> 
      <hr> 
      <small>Reply from '.$rows->reply_username.', '.$timeAgo->inWords($rows->reply_time).'</small> 
      <p>'.nl2br($rows->reply_message).'</p> 
      <hr> 
     '; 

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

    if(!empty($errors) && is_array($errors)) { 
     foreach($errors as $error) { 
      echo $error; 
     } 
    } 
} 
+0

在查询后粘贴整个代码 –

+0

正如@PlatinumIndustries所说,我们需要在代码之后;您所拥有的查询将会为您提供所有正确的信息。你的问题似乎是在你如何处理它。 –

+0

对不起,我添加了查询后运行的代码 – Jon

回答

1

你还没有给予太多的去,但你的查询似乎没问题(基于逻辑),只留下一个可能的罪魁祸首。

默认情况下PDO使用PDO::FETCH_BOTH作为其提取结果。这意味着它将每一列映射到其名称和“整数”列名称。

您可能需要在查询中使用$statement->fetchAll(PDO::FETCH_ASSOC);以获得您期望的输出。

在这里阅读更多关于。

0

这可能需要一些调整,但在这里我想接近它的方式:

while($rows = $ticket->fetch_object()) { 
    if($_SESSION['ticket_username'] == $rows->client) { 
     $status = $rows->status; 
     if($lastID != $rows->id){ 
      echo ' 
       <h3>'.$rows->subject.'</h3> 
       <small>Created by '.$rows->client.', '.$timeAgo->inWords($rows->created_at).'</small> 
       <hr> 
       <p>'.nl2br($rows->message).'</p> 
       <hr>'; 
     } 
     $lastID = $rows->id; 

     echo ' 
      <small>Reply from '.$rows->reply_username.', '.$timeAgo->inWords($rows->reply_time).'</small> 
      <p>'.nl2br($rows->reply_message).'</p> 
      <hr>'; 

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

    if(!empty($errors) && is_array($errors)) { 
     foreach($errors as $error) { 
      echo $error; 
     } 
    } 
} 

这是什么做的是检查是否本次打印票据ID是一样的,最后一个是印刷;如果是,则不要再次打印初始消息。我不确定您的查询是如何对结果进行排序的,因此您可能需要在里面找到ORDER BY ticket.id, replies.ticket_id,以确保它们全部组合在一起。

+0

感谢您的回复。我确实使用并调整了一下你的答案,但得到了同样的结果。我现在已经制定了一个解决方法来实现我的结果。和你的类似,我只是创建了一个count变量,并在它开始循环访问数据库结果时添加一个变量,然后使用一个简单的检查来查看count是否等于1,并输出初始消息。 – Jon

+0

糟糕。可能是因为'lastID'变量是在while()'循环中首次声明的。我并不太熟悉PHP,但是通常在循环中定义一个变量会导致它每次被声明,从而重置它的内容并且不允许'if'检查函数如何运行。 –

相关问题