代码之家  ›  专栏  ›  技术社区  ›  KAT

在试图查找基于日期的表的max行时返回奇怪的值

  •  0
  • KAT  · 技术社区  · 6 年前

    我在做一些我认为相对简单的事情。获取用户的最后一个输入值。 我有一个表,跟踪他们所有的条目,叫做计划活动日志。我使用此语句获取有关单个用户的所有活动:

    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 回复  |  直到 6 年前
        1
  •  1
  •   Shyamala Gopalakrishnan    6 年前

    这应该管用

    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
  •  2
  •   krokodilko    6 年前

    知道我做错了什么吗?

    你没有做错什么。根据 the manual

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

    换句话说,这种行为符合规范。查询返回一个随机的非确定性值,因为您使用的是MySQL对GroupBy查询的非标准扩展。

        3
  •  0
  •   Michał Turczyn    6 年前

    尝试此查询:

    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;