尝试根据日期查找表的最大行时返回奇怪的值

时间:2018-08-17 17:31:46

标签: mysql sql database

我正在尝试做一些我认为相对简单的事情。获取用户最后输入的值。 我有一个表,该表跟踪所有它们的条目,称为plan_activities_logs。我使用此语句来获取有关单个用户的所有活动:

SELECT created_at as last_active, plan_id, plan_value 
from plan_activity_logs where plan_id IN (select id from plans where tile_id = 30);

它给了我一个看起来像这样的表:enter image description here

但是当我尝试做这样的事情时:

SELECT MAX(created_at) as last_active, plan_id, plan_value from plan_activity_logs where plan_id IN (select id from plans where tile_id = 30);

我明白了: enter image description here

当日期和ID正确时,计划值是错误的值。知道我在做什么错吗?

3 个答案:

答案 0 :(得分:2)

  

知道我在做什么错吗?

您没有做错任何事情。根据{{​​3}}

  

如果禁用了ONLY_FULL_GROUP_BY,则对标准SQL使用GROUP BY的MySQL扩展允许选择列表HAVING   条件或ORDER BY列表以引用未聚合的列,即使   这些列在功能上不依赖于GROUP BY列。这个   使MySQL接受前面的查询。在这种情况下,服务器   可以从每个组中自由选择任何值,因此除非它们是   相同,选择的值是不确定的,可能不是   你想要什么。

换句话说,此行为符合规范。该查询返回一个随机的不确定性值,因为您对查询组使用了MySql非标准扩展。

答案 1 :(得分:1)

这应该有效

SELECT created_at as last_active, plan_id, plan_value from plan_activity_logs where plan_id IN (select id from plans where tile_id = 30) order by created_at desc limit 1;

答案 2 :(得分:0)

尝试此查询:

select @rn := 1;
select created_at as last_active, 
       plan_id, 
       plan_value
from (
    select created_at as last_active, 
           plan_id, 
           plan_value,
           @rn := @rn + 1 rn
    from plan_activity_logs
    where plan_id IN (select id from plans where tile_id = 30)
    order by created_at desc
) a where rn = 1;