【问题标题】:MySQL - Retrieve last update per day per userMySQL - 检索每个用户每天的最后更新
【发布时间】:2013-02-02 06:16:58
【问题描述】:

我有一个带有列的假设表“用户”

  • user_id(自动递增)
  • 姓名
  • 富
  • 酒吧
  • last_updated

此表格每天更新多次。如何查询以获取每个用户每天的最后一次更新,回溯 X 天?

示例数据

1 John a b "2013-01-31 02:01:12"
2 Rich c d "2013-01-31 22:41:12"
3 John e f "2013-01-31 22:01:15"
4 Rich g h "2013-02-01 16:01:12"
5 John i j "2013-02-01 22:21:12"
6 Rich k m "2013-02-01 22:21:12"

期望的返回集:

2 Rich c d 2013-01-31
3 John e f 2013-01-31
5 John i j 2013-02-01
6 Rich k m 2013-02-01

我可以通过以下查询获得每个用户的最后一次更新,它将它应用于我正在努力的每一天。

SELECT u1.*
FROM users u1 
    LEFT JOIN users u2
    ON (u1.name = u2.name AND u1.user_id < u2.user_id)
WHERE u2.user_id IS NULL

【问题讨论】:

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


    【解决方案1】:

    首先,表名users 非常混乱,因为这些不是用户而是登录。

    除此之外,您是在正确的道路上。您只需要在联接中添加对日期的比较即可。

    SELECT u1.*
    FROM users u1
        LEFT JOIN users u2
        ON (u1.name = u2.name AND date_format(u1.last_updated, '%Y-%m-%d') = date_format(u2.last_updated, '%Y-%m-%d') AND u1.user_id < u2.user_id)
    WHERE u2.user_id IS NULL
    

    在SQL fiddle 中查看它的工作原理。

    【讨论】:

    • @dtcarls 请看一下。
    • 这是一个超级清理版本的表,因此表名和列名已更改,但感谢您提供更高效的查询版本。看来我已经很接近了,我只是无法正确地进行最后一次加入。
    【解决方案2】:

    通过在日期级别汇总数据然后再加入来做到这一点:

    select u.*
    from users u join
         (select u.nanme, DATE(last_updated) as thedate, MAX(last_updated) as maxlastupdated
          from users u
          group by u.name, DATE(last_updated)
         ) usum
         on u.name = usum.name and
            u.last_updated = usum.maxlastupdated
    

    【讨论】:

    • 使用子查询可以,但速度很慢。 @dtcarls 你的初始查询更好。
    • @ArnoldDaniels 。 . .说原始查询更好是相当奇怪的。该查询不会产生所需的结果。
    • @GordonLinoff 他只需要在加入当天添加比较。其余的查询很好。看看它是如何工作的:)
    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 2010-11-21
    相关资源
    最近更新 更多