【问题标题】:MySQL query to fetch last record from each group involving 2 columnsMySQL查询从涉及2列的每个组中获取最后一条记录
【发布时间】:2016-10-17 07:14:31
【问题描述】:

我正在编写一个 MySQL (MariaDB) 查询来获取用户从中收到消息的发件人列表。就像在 Facebook 收件箱中一样,我希望最近的发件人首先出现,我已经通过以下查询:

SELECT  DISTINCT user_id_s
    FROM  messages
    WHERE  id IN (
        SELECT  MAX(id)
            FROM  messages
            WHERE  user_id_r=390
            GROUP BY  user_id_s
                 )
    order by  id DESC 

它似乎工作得很好(不确定它是否能很好地处理像一百万行这样的大记录?)。但真正的问题是,如果用户收到最后一条消息而不是最后一条回复,它只会按顺序获取。

例子:

用户 390 已按此顺序收到以下用户的消息:

  1. 385
  2. 421
  3. 422
  4. 423
  5. 424
  6. 429
  7. 430
  8. 431

所以现在用户 431 是最新的并显示在列表顶部,但如果用户 390 回复了用户 431,它会停留在底部,而我希望根据上次交互显示在顶部。

我希望我解释得很好。

编辑:这是一个 SQL 小提琴:http://sqlfiddle.com/#!9/82417/2

在此示例中,带有“573”的行 ID 应出现在顶部,替换第 572 行,其余结果必须保持不变。同样具有 user_id_s 的第二列应该在第一行给出“431”,就像现在一样。

【问题讨论】:

  • 因为您是按 id 订购的,即order by id DESC。恕我直言,选择永远不会解决问题,也不会扩展。解决这个问题的正确方法是创建动态逻辑,以静态方式将消息置于期望序列中。
  • @mootmoot 您能否详细说明“动态逻辑”部分?一个例子?
  • 将此可视化为纸质文件系统。将排序和插入消息的方式转换成各自的序列到插入逻辑中。

标签: mysql sql mariadb


【解决方案1】:

“last”的定义:你需要的是MAX(id),而不是

SELECT id
    FROM messages
    WHERE ...
    ORDER BY last_replied DESC
    LIMIT 1

缩放:见Groupwise Max

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-09
    • 2012-02-13
    • 2021-10-27
    • 1970-01-01
    • 2011-01-12
    • 2010-11-21
    相关资源
    最近更新 更多