質問: グループからランダムに抽出する方法 レコードをグループ化して、そのグループから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 ... というように、いちいち全組分を繰り返していますが、もっと良い方法がありましたら、ご教授お願いいたします。
回答: 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`; 競合とかきになりますが、所詮ヒープだし。