新品価格 |
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