日々精進

新しく学んだことを書き留めていきます

MySql - ユーザ変数

MySqlOracleのROW_NUMBER関数と同じ機能を使いたいと思って調べていると
以下のSQLで実現できると書いてあるサイトを発見。

set @rownum=0;
select
  @rownum:=@rownum+1 as rownum,
  c1,c2
from tbl1
order by c1

MySqlではユーザ変数というものが使えるらしい。知らなかった。。
しかしこのまま実行してもうまくいかない。
どうもユーザ変数のスコープが原因らしい。ユーザ変数のスコープは「接続ごと」と書かれている(詳しくはMySQL :: MySQL 4.1 リファレンスマニュアル :: 6.1.4 ユーザ変数)が、どうも1つのSQL文の実行が終わったらユーザ変数は無効になるみたい。
つまり、上のSQLはset @rownum=0;の実行後に@rownumの内容はクリアされるので二つ目のselect文ではNullになっている。
上のSQLをunion allを使って一つの文にすることで解決した。

select @rownum:=0
union all
select
  @rownum:=@rownum+1 as rownum,
  c1,c2
from tbl1
order by c1

今度はちゃんと動作した。MySqlはfrom dualとか書かなくてもいいんだね。