MySqlでOracleの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とか書かなくてもいいんだね。