回答

收藏

预订GROUP BY语句

技术问答 技术问答 217 人阅读 | 0 人回复 | 2023-09-13

我有以下sql表和数据:http :
. N* i$ P/ E! b! A" W4 j2 A0 F//sqlfiddle.com/# !9 /% C7 }) w9 ]# |" A. b
81c3b6/2/0。' k+ k1 o% Q. A9 G' S) x
基本的无序SQL语句是:
5 m& p, l% B- k7 @  x1 p& vSELECT territory_id, platform_type_id, store_url
+ d$ r1 @) [( I/ dFROM main_itemmaster' U7 z3 \4 M1 `# w. M: U
GROUP BY platform_type_id% q) G3 a) R' y' W
我想为表中的每个条目获取一个条目platform_type_id,并优先选择territory_id='US'。也就是说,如果存在where项,那么territory_id='US'我想在GROUP" t  [; I  O4 f% _
BY语句中获取该项。
: \" ]; n9 a+ b/ K( t8 |, J什么是正确的SQL语句,以便首先返回对US项目具有首选项的GROUPED BY语句?
8 L. L- g  c* ]7 |: E3 \  g               
: T, T, W8 b& O5 |解决方案:4 `) t7 [5 e, \3 N  m0 v8 A  Y
               
- j! J& k" F# c- u: x6 `
; x1 l. x# r0 u- B* a
: x  O* \9 e" M% k- j                在MySQL中,最安全的方法可能涉及变量:/ t, s* K) B  @0 a2 J# o% P0 H
select im.*& K9 ?. O6 S. y
from (select im.*,# P" T& f0 Y& K9 o- A/ m9 B
             (@rn := if(@p = platform_type_id, @rn + 1,
! p1 w- Y3 {$ M/ x                        if(@p := platform_type_id, 1, 1)
5 }0 r' R4 o' N+ ]% z                       )
5 n: c7 m( J2 Z1 y7 U1 K             ) as rn! v: K, A: q% q' u/ U0 q
      from main_itemmaster im cross join$ G- i- Z& l4 h0 @3 X% ?
           (select @rn := 0, @p := '') params0 u( e4 X0 ~' H; a) F
      order by platform_type_id, (territory_id = 'US') desc* u8 [/ L5 a4 N8 [
     ) im
4 S8 t, e- e& G; p" Y6 @5 mwhere rn = 1;
8 ?8 H+ B. Y- j/ K并不涉及使用MySQL(mis)功能,该功能允许SELECT聚合查询的列中未聚合的列也不包含GROUP BY。8 d; N* b* k, ?( q0 }/ e
这是一个SQL Fiddle,显示了它的工作原理。
) b4 W- X8 {1 s$ T5 e. c3 z' m编辑:. D* ~/ o7 \, b2 H( m1 {$ C
关于变量评估的顺序。从文档中:7 K) J& x; X* X, F

3 b1 f: C' o& E; x" r2 r) w8 e作为一般规则,除了inSET语句外,永远不要为用户变量分配值,并且不要在同一条语句中读取该值。例如,要增加变量,可以:
, n3 @- h8 R5 d3 D- I0 }# L8 RSET @a = @a + 1;% e, H( p. R$ [5 s" X4 H
对于其他语句,例如SELECT,您可能会得到预期的结果,但这不能保证。在下面的语句中,您可能认为MySQL将首先评估@a,然后再进行赋值:+ o8 l% F: R6 F% t) E* @" s; V
SELECT @a, @a:=@a+1, ...;
4 n2 d6 m$ {$ w0 u但是,涉及用户变量的表达式的求值顺序是不确定的。
$ D& [4 A6 f  }$ _4 ]
# ^- Z, s, |5 j; m$ \, c" ^从技术上讲,以上代码确实在同 一条语句中 读取了变量,但在同一 表达式中# X$ _8 i" P; y4 K- @7 j
也是如此。if()(case有时我也使用)的语义保证了对表达式求值的顺序。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则