您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

预订GROUP BY语句

预订GROUP BY语句

MysqL中,最安全的方法可能涉及变量:

select im.*
from (select im.*,
             (@rn := if(@p = platform_type_id, @rn + 1,
                        if(@p := platform_type_id, 1, 1)
                       )
             ) as rn
      from main_itemmaster im cross join
           (select @rn := 0, @p := '') params
      order by platform_type_id, (territory_id = 'US') desc
     ) im
where rn = 1;

并不涉及使用MysqL(mis)功能,该功能允许SELECT聚合查询的列中未聚合的列也不包含GROUP BY

一个sql fiddle显示了它的工作原理。

编辑:

关于变量评估的顺序。从文档中

作为一般规则,除了inSET语句外,永远不要为用户变量分配值,并且不要在同一条语句中读取该值。例如,要增加变量,可以:

SET @a = @a + 1;

对于其他语句,例如SELECT,您可能会得到预期的结果,但这不能保证。在下面的语句中,您可能认为MysqL将首先评估@a,然后再进行赋值:

SELECT @a, @a:=@a+1, ...;

但是,涉及用户变量的表达式的求值顺序是不确定的。

从技术上讲,以上代码确实在同 一条语句中 读取了变量,但在同一 表达式中 也是如此。if()case有时我也使用)的语义保证了对表达式求值的顺序。

其他 2022/1/1 18:46:27 有347人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶