【问题标题】:Create messages conversation list创建消息对话列表
【发布时间】:2025-01-14 14:20:01
【问题描述】:

好的,我正在尝试在 PHP 中构建用户拥有的所有消息的对话列表。 我的数据库设置有 4 个字段,发送者 ID、接收者 ID、时间戳和消息。我的查询返回接收者 ID 等于当前用户 ID 的每个结果。我只想选择每个发件人 ID 的第一次出现。即:

==================================================
| Sender ID | Receiver ID |    Time    | Message |
==================================================
|     2     |      1      | 1373914164 |   test  | <--- this one
|     2     |      1      | 1373914155 | ..test  |
|     1     |      1      | 1373914134 |...test  | <--- this one
|     2     |      1      | 1373914111 |   test. |
|     1     |      1      | 1373914108 |   test..|
|     3     |      1      | 1373914102 |   test  | <--- this one
|     3     |      1      | 1373914101 |   test  |
==================================================

我的想法是使用 PHP 过滤数组中的结果,但我只是在这里完全放屁。有什么想法吗?

【问题讨论】:

    标签: php mysql list messages


    【解决方案1】:

    您可以使用 SQL 通过按时间排序然后限制为 1 来完成

    类似

    Select ....
    ORDER BY Time DESC
    LIMIT 1
    

    【讨论】:

    • 这不会返回我正在寻找的结果,只返回最新的一行。我需要在整个表中第一次出现每个发件人 ID。
    • 啊,我误解了这个问题,以为我们是针对每个用户进行查询的。在这种情况下,Java Devil 的答案应该适合你
    【解决方案2】:

    你可以这样做

    SELECT *     -- Or what ever Columns
    FROM aTab    -- Your table name
    WHERE time IN (
       SELECT MAX(time) 
       FROM aTab
       WHERE R_id = 1 -- would help create better consistency
       GROUP BY S_ID)
    AND R_id = 1
    

    但是,如果接收方碰巧(我认为不太可能)同时收到消息,这可能会导致奇怪的结果

    你可以在这里看到这个SQLFiddle

    【讨论】:

    • 在您的小提琴中,查询工作完美,但由于某种原因,在我的本地主机服务器上,它只返回每一行。我完全实现了查询,并将字段名称替换为与我对应的字段名称表。