用户变量:以“@”开始,形式为“@变量名”。用户变量跟mysql客户端是绑定的,设置的变量,只对当前用户使用的客户端生效。
全局变量:定义时,以如下两种形式出现,set GLOBAL 变量名 或者 set
@@global.变量名,对所有客户端生效。只有具有super权限才可以设置全局变量。
会话变量:只对连接的客户端有效。
局部变量:作用范围在begin到end语句块之间。在该语句块里设置的变量。declare语句专门用于定义局部变量。set语句是设置不同类型的变量,包括会话变量和全局变量。
通过变量简单实现一下:
SELECT @rank := IF(@bid = tv.ZId, @rank := @rank + 1, @rank := 1) AS RANK, @bid
:= tv.ZId AS ZID, tv.ZTime FROM (SELECT * FROM tb_chestnut ORDER BY ZId, ZTime)
tv, (SELECT @rank := 0, @bid := NULL) z;
通过变量简单实现一下:
SELECT tv.ZSort, @bid := tv.ZId, @stime := IF(@bid = tv.ZId AND tv.ZSort = 1,
tv.ZTime, IF(@etime IS NULL, tv.ZTime, @etime)) AS stime, @etime := DATE_ADD(
@stime, INTERVAL tv.ZNum HOUR) AS etime, tv.ZNum FROM (SELECT * FROM tb_chestnut
ORDER BY ZId, ZSort) tv, (SELECT @stime := NULL, @etime := NULL, @bid := NULL) z
;
注:针对于分组排名问题mysql8.0版本可以使用row_number()over(partition by desc)