加入查询无法按我想要的方式运行

时间:2015-06-23 20:58:25

标签: php join mysqli

我有两个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));

我做错了吗?我的逻辑错在一个地方吗?

我也喜欢我之前的查询添加'INNER join'和'left join',但是inner给了我与我目前相同的输出。

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

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;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

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

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

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

在此处详细了解PDOStatement::fetchAll

答案 1 :(得分: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来确保它们全部归为一类。