【问题标题】:Best practice to get newest row in a table获取表中最新行的最佳实践
【发布时间】:2014-08-14 23:16:43
【问题描述】:

考虑这样的表格:

id 列设置为自动递增,update_time 列应该是该行插入表中的日期。

我想简单地获取 user_id = x 的用户的最新条目,我发现有一些方法:

SELECT * FROM mytable WHERE user_id = x ORDER BY update_time DESC LIMIT 1

还有

SELECT * FROM mytable WHERE user_id = x MAX(update_time)

另一个查询将选择具有最高 id 号的行

我不太确定后面那个的语法(请纠正我)。

这似乎是一项微不足道的任务,但是有一个案例是其他人更改了 table 上的 auto_increment 值,有时服务器的时间也发生了变化(这在我的案例中没有发生,但是什么如果是!!?)

获取 user_id 的最新条目行最安全的查询是什么(我的意思是为 user_id = x 的用户返回 weight、height 和 activity_level 的查询)

我需要在表格中添加更多列吗?如果有,是什么?

【问题讨论】:

  • 您的 user_id 是唯一字段吗?你所说的“我只想为 user_id = x 的用户获取最新条目”让我觉得可能有重复的 user_id
  • 如果是唯一的,改变自动增量键或者改变update_time都没有关系。您总是会为该用户获得相同的价值。

标签: mysql sql select sql-order-by


【解决方案1】:

我喜欢这种加入方法。假设 userID + update_time 是唯一的...如果不是,它将拉回多行。

select user_id, max(update_time) maxtime from table group by user_id

通过用户 ID 获取最大更新时间的简单语句。将其用作带有内连接的子查询(内连接将用作过滤器)

select t.*
from table t
inner join
 (select user_id, max(update_time) maxtime 
     from table group by user_id
      --where user_id = x
       )a
on a.user_id = t.user_id and a.maxtime = t.update_time

我注释掉了 where user_id = x 行...这种方法的优点是您可以一次获取所有用户及其最近的用户。

【讨论】:

    【解决方案2】:
    SELECT * FROM mytable WHERE user_id = x AND update_time = (SELECT MAX(update_time) FROM mytable WHERE user_id = x)
    

    【讨论】:

    • 在子查询中需要一个 from 语句
    【解决方案3】:

    这真的不必那么复杂:

    SELECT id
    FROM table
    WHERE user_id = x
    ORDER BY update_time DESC
    LIMIT 1
    

    此版本将是最快、最简单、最容易阅读的版本。这在各个方面都是一场胜利。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-13
      • 2016-08-26
      • 2016-03-04
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 2011-01-19
      • 1970-01-01
      相关资源
      最近更新 更多