指定キーの重複があればランダムでひとつだけ抽出したいっていう要望をMySQLで叶える話をパワプロで例えた話

今までに自分が育ててきた選手のデータベースがあるとするじゃろ。

 

id | 選手名 | 高校  | ポジ | ランク

 1 | もちこ | パワ校 | 投手 | A

 2 | よしこ | 脳筋 | 野手 | B

 3 | さちこ | 脳筋 | 投手 | C

 4 | よしお | 覇道  | 内野 | C

 5 | もっち | パワ校 | 保守 | A

 6 | ぽんた | 脳筋 | 投手 | D

 7 | さかな | 瞬鋭  | 内野 | C

 8 | ゴリラ | パワ校 | 外野 | S

 9 | さとし | 北雪  | 投手 | B

 

たとえば、誰かに自分が育ててきた選手を自慢したい。

しかも、ひとつの高校につきひとりずつ自慢したい。

さらに、その一人っていうのも一番強い人とかじゃなくて、ランダムで自慢したい。

全ての子を自慢する機会がほしい。

とする。

 

その場合、MySQLのこんな書き方でどうじゃ。

 

SELECT  *

FROM  (

    SELECT id,  選手名, 高校, ポジ, ランク,  RAND() as r

    FROM  選手データ

    ORDER BY r

)    AS  pre

GROUP  BY  高校 ;

 

取得するデータをランダムに並び替えるために

選手データテーブルに乱数を振ってオーダーバイ

それをSELECTで参照、高校名でグループ化。

 

 こうすることで、

 

id | 選手名 | 高校  | ポジ | ランク | r

 3 | さちこ | 脳筋 | 投手 | C   | 0.0954203…

 4 | よしお | 覇道  | 内野 | C   | 0.1549204…

 7 | さかな | 瞬鋭  | 内野 | C   | 0.4970004…

 8 | ゴリラ | パワ校 | 外野 | S   | 0.5970679…

 9 | さとし | 北雪  | 投手 | B   | 0.6087944…

 

こんなかんじのデータがとれて、

SQLの実行ごとに、いろんな生徒が現れるよ!

 

各カテゴリの登録ユーザーを均等に露出させたいときとかにも

ちょっとつかえるとおもうんじゃ。