【问题标题】:Get desc or last inserted data while using GROUP BY [duplicate]使用 GROUP BY 时获取 desc 或最后插入的数据 [重复]
【发布时间】:2018-06-24 08:59:38
【问题描述】:

祝你好运。

我有一个包含大量数据的表,我需要所有数据,但最后更新的数据除外

Table

id  -   name    -   user_id -   email
1   -   abc     -   1   -   abc@email.com
2   -   xyz     -   2   -   xyz@email.com
3   -   abc     -   1   -   abc@email.com
4   -   pqr     -   3   -   pqr@email.com
5   -   abc     -   1   -   abc@email.com
6   -   pqr     -   4   -   pqr@email.com

现在我查询像这样的东西

SELECT MAX(id),* 
FROM `table`
GROUP BY user_id 
ORDER BY id DESC

但它没有返回预期的输出。我的预期输出是

id  -   name    -   user_id -   email
5   -   abc     -   1   -   abc@email.com
2   -   xyz     -   2   -   xyz@email.com
4   -   pqr     -   3   -   pqr@email.com
6   -   pqr     -   4   -   pqr@email.com

只有最后插入的数据才会显示。我参考this 的答案,但它不是为了获取所有数据。那么如何获取分组id时最后插入的所有数据呢?

【问题讨论】:

    标签: mysql sql greatest-n-per-group


    【解决方案1】:

    您可以在同一张表上使用自连接来选择每个用户的最新行

    SELECT a.* 
    FROM `table` a
    JOIN (
        SELECT user_id , MAX(id) id
        FROM table
        GROUP BY user_id 
    ) b ON(a.user_id = b.user_id AND a.id = b.id)
    ORDER BY a.id DESC
    

    Demo

    【讨论】:

      【解决方案2】:

      特别是如果您要对最终结果进行排序,则应该考虑使用相关子查询:

      select t.*
      from t
      where t.id = (select max(t2.id)
                    from table t2
                    where t2.user_id = t.user_id
                   )
      order by t.id desc;
      

      为了提高性能,您需要在 (user_id, id)(id) 上建立索引。

      【讨论】:

        猜你喜欢
        • 2020-09-23
        • 2013-09-20
        • 1970-01-01
        • 2017-12-31
        • 1970-01-01
        • 2011-11-10
        • 2013-06-27
        • 1970-01-01
        • 2020-06-24
        相关资源
        最近更新 更多