レコードをグループ化して、そのグループから1レコードをランダムに選択する方法はないでしょうか?
具体的には、たとえば以下のようなことです。
以下のようなテーブルがあるとします。
組 氏名
-----------------
A組 鈴木
A組 木村
B組 山田
B組 佐藤
B組 田中
C組 石井
C組 井上
D組 田口
このテーブルから、各組から代表を1人ずつランダムに選びたいです。
たとえば、
A組 鈴木
B組 田中
C組 石井
D組 田口
というように、A組には2人いますが1人をランダムに、B組には3人いますが1人をランダムに、…、という感じです。
集合関数には合計や平均などの数学関数はあるのですが、このようなことを実現するものが見あたりません。
現在は、まず先に組でグループ化したクエリを実行し、A組から順番に
SELECT ~ WHERE 組="A組" ORDER BY RND() LIMIT 1
を実行、次に
SELECT ~ WHERE 組="B組" ORDER BY RND() LIMIT 1
…
というように、いちいち全組分を繰り返していますが、もっと良い方法がありましたら、ご教授お願いいたします。
No.1
- 回答日時:
結果を後で、分解しないといけませんが、
SELECT 組,MAX(CONCAT(CAST(RAND() AS CHAR),CONCAT('-',氏名)))
FROM テーブル
GROUP BY 組;
というのは、どうでしょう。
ご回答ありがとうございます。
なるほどつまり、グループ化の際にグループ内の要素に数値をランダムにふって、その最大を取り出す、ということですね?
早速試してみようと思ったのですが、なぜか文法エラー、調べてみると、今借りているサーバーのMySQLのバージョンが3.23.56で、CASTが使えないとのこと…。何か別の方法でCASTのようなことをすればよさそうですが。
しかし、せっかくご回答いただいたのに恐縮なのですが率直に申し上げると、
後で分解するということは、全組分のループをすることになり、質問文に書いた、組ごとにランダムに1つ選ぶ処理と、結局は大差がないような気がしまして…。
できればループなどは使わずSQLだけで抽出できたらと思うのですが。
このような処理ってよくありそうなんですが、常套手段のようなものはないのでしょうか…。
No.2ベストアンサー
- 回答日時:
order by してから group by すればいいじゃん!とおもったらできないんですね。
よく考えればそりゃそうなんですけど
ソートしてからグループ化ってのは確かにRDBとして効率わるいし。
というわけで、非効率ではありますが、ヒープで処理してみてはいかがですか?
CREATE TABLE `tmp_table` TYPE=HEAP SELECT `*` FROM `org_table` ORDER BY RAND();
SELECT `*` FROM `tmp_table` GROUP BY `class`;
DROP TABLE `tmp_table`;
競合とかきになりますが、所詮ヒープだし。
ご回答ありがとうございます。
今は、ご提案いただいたのと同じような、HEAPテーブルではないですがTEMPORARY TABLEを作って、ORDER BY RANDを付けてコピーしておいて、その後にGROUP BYする、という方法を取ることにしています。
やはりHEAPテーブルは競合が気になりますので、同時に実行されたことを考えてTEMPORARY TABLEにしました。
まぁ結果的に「order by してから group by すればいいじゃん」の方法なんですけどね。2段階になっただけで。
ご指摘のように効率的じゃないかもしれませんが、
SELECTの入れ子とか使えたら楽なんだろうけど、とりあえず、これしかないのかなと…。
それにしても、このような要求ってよくありそうなんですがねぇ…。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL うまくいきません教えてくださいお願いしますSQLです。クエリ構文です。 1 2023/07/07 12:39
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- PHP php my adminより取り出したデータ表示 2 2022/06/15 11:56
- 政治 選挙はランダム投票でするべきだろう。 ランダム投票とは、国民から無作為に投票者を抽出する投票制度。 4 2022/06/24 17:09
- MySQL 【MySQL】本当に困っているので、助けてください。よろしくお願いします。 3 2023/06/03 14:24
- PHP PHP MySql ページング 2 2022/09/20 06:38
- MySQL 下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 「名前(first name) 1 2023/06/24 13:03
- Visual Basic(VBA) Powerpointでランダムな数字の結果を表示するマクロ 2 2023/08/04 10:04
- MySQL 下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 日本の全市区町村を人口密度が低 1 2023/06/18 19:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
一つ前に戻るには…
-
mysqlでJOIN文
-
SQL、2つのテーブルで条件一致...
-
sqlplusで表示が変なので、出力...
-
Accessでデータシートに同じデ...
-
テーブル名をカラムとして取得...
-
update文で改行を入れる
-
テーブルリンク リンク元を知...
-
住所のDBテーブル、マスターの...
-
L2SWはARPテーブルを持っている?
-
ROWNUMでUPDATEをしたいのです...
-
一致するデータのみ削除したい
-
外部キーだけのテーブル(主キ...
-
ビューのソートについて
-
数値をNUMBER型にするかCHAR型...
-
SQLです。こんな感じですか?あ...
-
SQLでSUMなどの関数でデータが...
-
うまくいきません教えてくださ...
-
Notion@リレーション値の取得...
-
他のデータベースとのテーブル結合
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
一つ前に戻るには…
-
mysqlのフィールド名
-
最大値を持つレコードを削除したい
-
mysqlでJOIN文
-
グループからランダムに抽出す...
-
1列について重複行を除いて全列...
-
SQL一発でカレンダー表示は可能...
-
mysqlで外部キーをつけたカラム...
-
矛盾していないでしょうか?
-
ビューに追加・削除が出来ません。
-
1000万件のデータをmysqlで効率...
-
テーブルが作成できない
-
【ストアドプロシージャ】条件...
-
挿入先テーブルに存在しないレ...
-
SQL内でループさせるような検索文
-
PHP上のSQLで、SELECT文をいく...
-
mysqlのデータベースを復元した...
-
複数の列にまたがってユニーク...
-
Waiting for table lockエラー...
-
MySQL INSERT文 エラー
おすすめ情報