【问题标题】:How to select only the latest rows for each user?如何只为每个用户选择最新的行?
【发布时间】:2013-03-26 18:17:44
【问题描述】:

我的桌子是这样的:

id  | user_id | period_id | completed_on
----------------------------------------
1   | 1       | 1         | 2010-01-01
2   | 2       | 1         | 2010-01-10
3   | 3       | 1         | 2010-01-13
4   | 1       | 2         | 2011-01-01
5   | 2       | 2         | 2011-01-03
6   | 2       | 3         | 2012-01-13
... | ...     | ...       | ...

我只想选择最新的用户期间条目,记住用户不会都有相同的期间条目。

基本上(假设我只有上表)我想得到这个:

id  | user_id | period_id | completed_on
----------------------------------------
3   | 3       | 1         | 2010-01-13
4   | 1       | 2         | 2011-01-01
6   | 2       | 3         | 2012-01-13

以下两个查询总是导致选择第一个 user_id 出现,而​​不是最新的(因为排序发生在根据我的理解选择行之后):

SELECT
    DISTINCT user_id,
    period_id,
    completed_on
FROM my_table
ORDER BY
    user_id ASC,
    period_id DESC

SELECT *
FROM my_table
GROUP BY user_id
ORDER BY
    user_id ASC,
    period_id DESC

【问题讨论】:

标签: mysql


【解决方案1】:

似乎这应该使用MAX 和子查询:

SELECT t.Id, t.User_Id, t.Period_Id, t.Completed_On
FROM my_table t
   JOIN (SELECT Max(completed_on) Max_Completed_On, t.User_Id
         FROM my_table
         GROUP BY t.User_ID
         ) t2 ON
      t.User_Id = t2.User_Id AND t.Completed_On = t2.Max_Completed_On

但是,如果您可能有多个记录,其中每个用户的 completed_on 日期相同,那么这可能会返回多个记录。根据您的需要,可能在您的子查询中添加一个 MAX(Id) 并加入它会起作用。

【讨论】:

    【解决方案2】:

    试试这个:

    SELECT t.Id, t.User_Id, t.Period_Id, t.Completed_On
    FROM table1 t
    JOIN (SELECT Max(completed_on) Max_Completed_On, t.User_Id
    FROM table1 t
    GROUP BY t.User_ID) t2 ON t.User_Id = t2.User_Id AND t.Completed_On = t2.Max_Completed_On
    

    DEMO HERE

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      • 2013-06-06
      • 2016-04-06
      • 2017-03-17
      相关资源
      最近更新 更多