php - 为什么我的查询返回不正确的结果?

标签 php mysql

大约两周前我最近问了一个与此类似的问题,但我没有考虑让我的问题按照我需要的方式工作。

我有一个从 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");
}

最佳答案

更改查询。

使用 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 Join 只返回两个表的值 匹配。这是一种两圆相交的东西。
  2. Left Join 返回左表中的所有行 是否在右表中有任何匹配项。

在您的情况下,如果您使用内部联接,它只会返回那些有回复的工单。

图片引用自 here

关于php - 为什么我的查询返回不正确的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31340987/

相关文章:

mysql - 检索同时具有标签 T1 和 T2 的记录

php - 基于 PHP 变量值的元素宽度%

php - 如何在 intelephense 中定义一个未定义的函数(在 VSCode 中)?

mysql - 左连接表,但随后喜欢列 - SQL

javascript - AJAX MySQL查询进度条

PHP MYSQL - 如何创建包含按天/周分组的多个下拉列表的表单

php - 在php中导入sql文件

php - 作为页面发布到 Facebook 页面墙

php - 将 Ajax 数据发布到 Controller 功能?

sql - mysql:如何将列更改为 PK Auto_Increment