来自MySQL Query的混合结果,如何排序

时间:2017-04-22 19:50:13

标签: php mysql pdo

我正在查询一个名为request的表,如下所示

+-------------------------------------------------------------------------+    
| message_id | client_id | admin_id | message | date_posted | read_status |
+-------------------------------------------------------------------------+

由于管理员需要获取所有未读取的消息(read_status = 0),但我不知道如何获取结果并将其显示在不同的标签示例中

Client 44
Hi Sir

然后是另一个部分(div)

Client 87
Give me the number

因此来自同一客户端的消息被放在一起并插入其自己的div中 事情是同一个客户端可以有多行具有不同的消息。哦,对于选中的每一行,我想将read_status更新为1,以便稍后不再选择。 非常感谢任何帮助!

PS 我使用PDO查询准备好的语句以保持清洁!

1 个答案:

答案 0 :(得分:2)

如果我理解正确,您需要<div&gt;对于每个客户端,其中<div>包含<div>所属的客户端的所有未读邮件。

这意味着您需要按客户对结果进行分组。有两种方法可以做到这一点:

  1. 让MySQL对消息进行排序,让PHP跟踪client_id更改的时间,以便您可以关闭之前的<div>并为新客户端打开新的消息;
  2. 在获取消息后使用PHP对消息进行分组,然后遍历该消息。
  3. 对于第一个选项,您可以执行以下操作:

    $current_client_id = 0;
    
    foreach ($conn->query("SELECT ... ORDER BY `client_id` ASC") as $message) {
        if ($message['client_id'] != $current_client_id) {
            if ($current_client_id > 0) {
                // if it's 0, there is no <div> to close yet
                echo '</div>';
            }
            echo '<div>';
            echo '<p>Messages for client #' . $message['client_id'] . '</p>';
            $current_client_id = $message['client_id'];
        }
    
        echo 'message details here';
    }
    
    if ($current_client_id > 0) {
        // if it's not 0, there were messages so you need to
        // close the last client's <div>
        echo '</div>';
    }
    

    对于第二个选项,您可以执行以下操作:

    $grouped_messages = array();
    
    foreach ($conn->query("SELECT ...") as $message) {
        $client_id = $message['client_id'];
    
        if (!isset($grouped_messages[$client_id])) {
            $grouped_messages[$client_id] = array();
        }
    
        $grouped_messages[$client_id][] = $message;
    }
    
    foreach ($grouped_messages as $client_id => $client_messages) {
        echo '<div>';
        echo '<p>Messages for client #' . $client_id . '</p>';
    
        foreach ($client_messages as $message) {
            echo 'message details here';
        }
    
        echo '</div>';
    }
    

    第一个选项更有效,因为你只循环一次。但在我个人看来,第二个选项提供更清晰,更易于阅读和理解的代码,所以如果你不处理大量的消息,或者如果你将消息数组传递给单独的视图层或模板。

    您必须自己填写查询,我不知道您是想要获取所有字段还是仅查看其中的一些字段,请按date_posted对其进行排序,仅过滤具有特定{{}的消息例如,或者将admin_id表与另一个表连接起来。

    我也没有使用预备语句,但你可以很容易地用request替换$conn->query()上的循环:

    $stmt = $conn->prepare("SELECT ...");
    $stmt->execute();
    foreach ($stmt->fetchAll() as $message) {
    

    只要您没有绑定任何参数,PDO::query()基本上就是简写。