2016年07月12日

SQLアンチパターン15章を読んだ

blogramランキング参加中!

SQLアンチパターン

新品価格
¥3,456から
(2016/7/12 22:42時点)



SQLアンチパターン14章を読んだ
の続編

15章はランダムセレクション
以下、ランダム

・本章
ランダムにデータを取得したい
そのやり方


・ランダムソート
select * from bugs order by rand() limit 1;
orderにrand()が入るの初めて知った。
ただし、パフォーマンスは最悪


・解決策1
データが最大値まですべて使われてる場合。
こんなスマートな方法あるんだなって感心した
select b1.* from bugs as b1
inner join(
select ceil(rand() * (select MAX(bug_id) from bugs)) as rand_id
) as b2 on b1.bug_id = b1.rand_id)


・解決策2
欠番がある場合
select b1.* from bugs as b1
inner join(
select ceil(rand() * (select MAX(bug_id) from bugs)) as rand_id
) as b2 on b1.bug_id >= b1.bug_id)
order by b1.bug_id limit 1;


・解決策3
PHPでがんばる。
DBから全部データ引っこ抜いて
ランダムに取得したidで再度データを引く。
デメリットは一度全部引くことがあることと
SQLの実行が2回必要


・解決策4
オフセットを使う。
select floor(
rand() * (select count(*) from bugs)
as id_offset)
してから
select * from bugs limit 1 offset offset



本章はとてもためになりました。
そういえばランダムで引くの大変だなーって思ってたので
かゆいところに手が届いた感じです。
まだまだ続く
タグ:SQL
posted by マスタカ at 22:44 | Comment(0) | TrackBack(0) | | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック