ひとりごと

新しい記事:[991]  古い記事:[988] 表示単位 :

ついったー[おとなり日記] かがみさん Y.Kumagaiさん

2003/11/03 (月)

・ ぐちゃぐちゃ並べ替え

配列の並べ替えみたいなのを 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 にしてしまえば簡単なのですが、並べ替えた後で挿入・移動なんかも考えているので余計に面倒くさそうな気がします
[つっこみ]

新しい記事:[991]  古い記事:[988] 表示単位 :
※このページへのリンクは自由です。リンクの方法については[つっこみ]で表示されるページの最後をごらんください。
たかたに(takatani@mars.dti.ne.jp)