小編給大家分享一下MySQL自定義變量實現row_number分析函數的問題示例,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
MySQL經常用自定義變量實現復雜查詢,比如row_number按組加行號的功能等.
但是這里面存在一個天坑.不可謂不深
先看試驗
create table tmp_num(
gid int,
score int);
create table tmp_var(
gid varchar(32),
score int);
insert into tmp_num
select
id%4,
ceil(1000*rand())
from nums where id<=20;
insert into tmp_var select concat('組',gid),score from tmp_num;

兩個表, 只是分組的類型不一樣,一個分組是 字符串,另外一個是整形.
首先查詢分組是整形的情況
select t1.gid,t1.score, case when @gid=gid then @rn:=@rn+1 when @gid:=gid then @rn:=1 else @rn:=1 end rn from ( select * from tmp_num ,(select @gid:=0,@rn:=0) vars order by gid,score ) t1;

如果其他的程序使用 該自定義變量查詢字符串分組的情況,則會出現bug
select t1.gid,t1.score, case when @gid=gid then @rn:=@rn+1 when @gid:=gid then @rn:=1 else @rn:=1 end rn from ( select * from tmp_var ,(select @gid:='',@rn:=0) vars order by gid,score ) t1;

在多個項目共用連接池的情況下,萬一出現這種情況,極難排查
等排查出來,生產環境的錯誤都不知道持續多少天了,
那時候就尷尬了,錯誤排除了,人也被開除了
所以還是 58處理的方式比較好,一刀切的禁用自定義變量
看完了這篇文章,相信你對“MySQL自定義變量實現row_number分析函數的問題示例”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。