配列の並べ替えみたいなのを PostgreSQL でやるのはどうするのかな~という考察。
まず、 PostgreSQLの簡単なランダム並べ替えとして、
select ID from テーブル order by random();という手法が使えるそうです。これを踏まえて、別のテーブル(CDの曲リスト)からぐちゃぐちゃに並べたもの(演奏リスト)を作成することにします。
-song (CDの曲リスト) -playlist (演奏リスト) Column | Type | Column | Type | --------+---------+----------- --------+---------+----------- id | integer | 曲シリアル番号 id | integer | 演奏順の番号 songid | integer | 曲番号としますと、
insert into playlist(id,songid) select (select max(id) from playlist)+1,id from song;にてできるかな~とおもったのですが、実際にやってみると playlist.id にはみんなおんなじ値が入ってしまって(笑)だめだめです。 insert を (select count(*) from song) 回行えば期待した動作をすると思いますが、いくらなんでもそれは・・・なので却下。
はじめは playlist.id を連番にするのがよくわからなかったのですが、よく考えたら連番じゃなくても重複しなければよいだけなので、
insert into playlist(id,songid) select random()*定数 0,id from song;でもよく似たことができそうです。『定数をテーブルの行数より大幅に大きくとらないと重複しやすい』というか『そもそも定数なんか入ってるのが醜い(^^;)』のですが、とりあえず定数を30000として実行すると(曲数1199)、重複行は21行でした。別件にて重複行の処理工程はかならず入ってきますし、1199行の insert に比べたら 21行の update のほうがだいぶマシそうです。 # ま、playlist.id を serial にしてしまえば簡単なのですが、並べ替えた後で挿入・移動なんかも考えているので余計に面倒くさそうな気がします