Mysql 在SQL中,如何通过比较时间属性为每个用户选择一行中的值,但只能选择最新的行?

Mysql 在SQL中,如何通过比较时间属性为每个用户选择一行中的值,但只能选择最新的行?,mysql,sql,Mysql,Sql,我有一个表,其中包含属性userid、value和time,表示为用户设置一些值。我想创建一个表,其中包含用户ID和值,但仅限于最新时间。例如,如果同一用户的行在时间40时显示为“绿色”,另一行在时间50时显示为“蓝色”,则查询结果应显示为“蓝色”。这里有一个例子说明了我是如何尝试这样做的,但是用户6仍然说“绿色”,即使属性“蓝色”是后来的事 您应该如何更改此项?您可以通过在子查询中为每个用户ID查找最大(时间),然后连接到该子查询以查找与最新时间相关联的值: SELECT p.* FROM

我有一个表,其中包含属性userid、value和time,表示为用户设置一些值。我想创建一个表,其中包含用户ID和值,但仅限于最新时间。例如,如果同一用户的行在时间40时显示为“绿色”,另一行在时间50时显示为“蓝色”,则查询结果应显示为“蓝色”。这里有一个例子说明了我是如何尝试这样做的,但是用户6仍然说“绿色”,即使属性“蓝色”是后来的事


您应该如何更改此项?

您可以通过在子查询中为每个
用户ID
查找
最大(时间)
,然后连接到该子查询以查找与最新
时间相关联的

SELECT p.*
FROM Persons p
JOIN (SELECT userid
             ,MAX(time) as latest_time
      FROM Persons
      GROUP BY userid
      ) sub
 ON p.userid = sub.userid
 AND p.time = sub.latest_time

演示:

问题是您得到的是
max(value)
。按字母顺序
绿色
大于
蓝色
。如果您将查询更改为
min(value)
,则用户6将显示蓝色。这并不能解决你的问题

要解决问题,您需要执行CTE或子选择。像这样的事情:

SELECT Persons.userid, MAX(value) as latest_value,
  MAX(time) as latest_time
  FROM Persons
  JOIN (
         select userid, max(time) as latest_time
         from Persons
         group by userid
    ) subSelect 
  ON subSelect.userid = persons.userid and latest_time = time
  GROUP BY userid;