【问题标题】:Select by latest timestamp按最新时间戳选择
【发布时间】:2015-09-08 11:53:45
【问题描述】:

我有一个下表:

+-------+--------+----------+ |分数 |用户 |报废时间 | +-------+--------+----------+ | 200 |鲍勃 | 2015-09-08 11:46:17 | +-------+--------+----------+ | 210 |爱丽丝 | 2015-09-08 11:46:17 | +-------+--------+----------+ | 240 |鲍勃 | 2015-09-08 11:48:00 | +-------+--------+----------+ | 260 |爱丽丝 | 2015-09-08 11:48:01 | +-------+--------+----------+

我想获取 每个用户 拥有 最新 scrap_time 的所有分数,并忽略较旧的分数。

例子:

+-------+--------+----------+ |分数 |用户 |报废时间 | +-------+--------+----------+ | 240 |鲍勃 | 2015-09-08 11:48:00 | +-------+--------+----------+ | 260 |爱丽丝 | 2015-09-08 11:48:01 | +-------+--------+----------+

我一直在尝试提出一个查询,比如这个:

select * from scores where date(scrap_time) = ( select max(scrap_time) from scores);

但这并没有给我我需要的结果。

【问题讨论】:

  • 为什么Bob也包含在预期的结果集中?
  • 因为我需要每个用户的最后一个分数
  • select score,max(scrap_time),user from scores
  • @Saty : 这只会返回一个结果,我需要选择所有用户

标签: php mysql


【解决方案1】:

首先您需要找到每个用户的 MAX(scrap_time),然后找到这些行

SELECT * FROM scores WHERE (user,scrap_time) IN (
 SELECT user,MAX(scrap_time) scrap_time FROM scores
 GROUP BY user);

【讨论】:

    【解决方案2】:

    您需要根据user 获得MAX(scrap_time),然后只需加入您的表即可获得所需的结果集。像下面这样的东西应该可以工作:

    SELECT s.score, s.user, s.scrap_time 
    FROM scores AS s
    INNER JOIN (SELECT user, max(scrap_time)  AS maxTime
                FROM scores
                GROUP BY user) AS t
    ON s.user = t.user AND s.scrap_time = maxTime
    

    Demo here

    【讨论】:

      【解决方案3】:

      将 max 函数与 group by 一起使用,它将提供每个分数的最近时间

       select   score, user, max(scrap_time) 
       from     scores  
       group by score;
      

      【讨论】:

        猜你喜欢
        • 2012-08-08
        • 2023-02-01
        • 2014-01-16
        • 1970-01-01
        • 1970-01-01
        • 2020-09-09
        • 2014-02-06
        • 2014-12-20
        • 2013-01-10
        相关资源
        最近更新 更多