実現したいこと
何かの懸賞のようなイメージで以下の様な応募履歴テーブル(drawings)があったとします。
この中からランダムで2名を当選者として抽出したいです。
※1レコードが応募1口
id | user_id | created |
---|---|---|
1 | 23 | 2023-02-16 |
2 | 45 | 2023-02-19 |
3 | 45 | 2023-02-22 |
4 | 99 | 2023-02-24 |
5 | 62 | 2023-02-26 |
6 | 23 | 2023-03-01 |
7 | 99 | 2023-03-04 |
8 | 45 | 2023-03-09 |
9 | 23 | 2023-03-11 |
10 | 23 | 2023-03-14 |
前提
応募してきた数だけ当選確率が上がるようなSQLを作りたいです。
例えば、user_id:23は4回応募してきているので、1回応募の人より4倍の確率で抽出されるようにしたいです。
ただし、重複をはじいて当選者を抽出したいです。
何回応募しても確率は上がりますが同じuser_idが2件抽出されることが無いようにしたいです。
発生している問題・エラーメッセージ
当初以下の様なSQLを思いついたのですが、 ORDER BY RAND() は GROUP BY の後に実行されるため、応募口数が無視されることに気づきました。
また DISTINCT を利用しても同様だと思います。
重み付き抽選のようなことがSQLで再現できればと思っています。
sql
1SELECT 2 * 3FROM 4 drawings 5GROUP BY user_id 6ORDER BY RAND() 7LIMIT 2
補足情報(FW/ツールのバージョンなど)
MySQL 8.0 を利用しています

回答1件
あなたの回答
tips
プレビュー