つっこみ

つっこみ欄にコメントを記載して[つっこむ]ボタンを押してください。
お名前欄の記載は省略できます。

お名前 :
←ここのテキストボックスはスパム対策用なので何も入力しないでください
つっこみ :

[キャンセル]


つっこみ先の記事

・ ぐちゃぐちゃ並べ替え

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

■この記事への permanent link URL(下にいくほどファイルサイズが大きくなります)
  http://toriyu.jp/hitorigoto/id989.html
  http://toriyu.jp/hitorigoto/2003-11-03.html (1日分)
  http://toriyu.jp/hitorigoto/2003-11.html#id989 (1ヶ月分)