用户变量:以“@”开始,形式为“@变量名”。用户变量跟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)