![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
レコードをグループ化して、そのグループから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.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の入れ子とか使えたら楽なんだろうけど、とりあえず、これしかないのかなと…。
それにしても、このような要求ってよくありそうなんですがねぇ…。
No.1
- 回答日時:
結果を後で、分解しないといけませんが、
SELECT 組,MAX(CONCAT(CAST(RAND() AS CHAR),CONCAT('-',氏名)))
FROM テーブル
GROUP BY 組;
というのは、どうでしょう。
ご回答ありがとうございます。
なるほどつまり、グループ化の際にグループ内の要素に数値をランダムにふって、その最大を取り出す、ということですね?
早速試してみようと思ったのですが、なぜか文法エラー、調べてみると、今借りているサーバーのMySQLのバージョンが3.23.56で、CASTが使えないとのこと…。何か別の方法でCASTのようなことをすればよさそうですが。
しかし、せっかくご回答いただいたのに恐縮なのですが率直に申し上げると、
後で分解するということは、全組分のループをすることになり、質問文に書いた、組ごとにランダムに1つ選ぶ処理と、結局は大差がないような気がしまして…。
できればループなどは使わずSQLだけで抽出できたらと思うのですが。
このような処理ってよくありそうなんですが、常套手段のようなものはないのでしょうか…。
お探しの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ランキング
-
一つ前に戻るには…
-
ビューに追加・削除が出来ません。
-
外部キー、親を調べるにはshow ...
-
PHP上のSQLで、SELECT文をいく...
-
Accessでデータシートに同じデ...
-
SELECT 文の NULL列は?
-
テーブル名をカラムとして取得...
-
単純なselectが遅くなるのです...
-
テーブルリンク リンク元を知...
-
アクセス レコードセットを更...
-
テーブルに存在しない列をselec...
-
L2SWはARPテーブルを持っている?
-
mysql alter table 終わらない
-
男性と2人で飲食店に行きテーブ...
-
他のデータベースとのテーブル結合
-
Accessのテーブルデータを一気...
-
外部キーだけのテーブル(主キ...
-
OracleのSQLで同テーブルのカラ...
-
会社の飲み会の幹事になり、座...
-
Access VBAからエクセルに出力...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
一つ前に戻るには…
-
ビューに追加・削除が出来ません。
-
最大値を持つレコードを削除したい
-
mysqlでJOIN文
-
SQL文による残業時間の算出につ...
-
mysqlのフィールド名
-
SQL一発でカレンダー表示は可能...
-
副問い合わせの限界値はどれく...
-
1列について重複行を除いて全列...
-
矛盾していないでしょうか?
-
mysqlで外部キーをつけたカラム...
-
MySQLのFOREIGN KEYについて
-
SQLを教えてください
-
MySQLのテーブル設計について
-
PHP上のSQLで、SELECT文をいく...
-
char型データ 固定長のままでs...
-
【ストアドプロシージャ】条件...
-
売上管理
-
テーブルの名前の付け方
-
外部キー、親を調べるにはshow ...
おすすめ情報