- ベストアンサー
この場合の賢いSQL文は?
id name age 1 Jone 22 2 Jone 21 3 Kelly 20 このケースで同名Joneは2人いるので、2人目のJoneは無視して、 Jone 22 Kelly 20 といったデータを取得したいのですが、方法はございますでしょうか? Jone 21 Kelly 20 でもかまいません。DISTINCT使っちゃうと Jone Kelly しか取得できないし、どうしてもわかりません。ご教示お願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
id は一意なんでしょ? 一意だと仮定するなら、理論は以下の通りです。 (1)nameでグループ化する。 (2)グループ化した際のid は最小値(最初に出た方)とする。 (3)このidと一致するデータを抽出する。 SELECT A.* FROM table A INNER JOIN (SELECT name,MIN(id) uid FROM table GROUP BY name) B ON A.name=B.name AND A.id=B.uid
その他の回答 (3)
- yambejp
- ベストアンサー率51% (3827/7415)
MySQLにはこういういい加減な処理があります SELECT name,age FROM テーブル group by name あまりおすすめできません。 実際、データを確定できないのであればSQLに処理をさせるのは危険です
お礼
ありがとうございます。是非試してみます。
- bin-chan
- ベストアンサー率33% (1403/4213)
> ageのところがもし文字だったらどうなりますか? 文字であっても大小はあります。そうでなければ、文字列でのソートができないでしょ? 数値・文字列どちらでもそのままでOKのハズですが、 1 Jone twenty 2 Jone twenty-one のどちらが最大・最小になるか、は試してみてください。
お礼
ありがとうございます。是非試してみます。
- bin-chan
- ベストアンサー率33% (1403/4213)
Oracleユーザなので多少異なるかも?だけど。 nameの最大・最小の場合なら、 最大の場合 select name, max(age) from <テーブル> group by name ; 最小の場合 select name, min(age) from <テーブル> group by name ;
お礼
返信ありがとうございます。ageのところがもし文字だったらどうなりますか?もしお分かりならご教示お願いいたします。 id name age 1 Jone twenty 2 Jone twenty-one 3 Kelly twenty
お礼
返信ありがとうございます。INNER JOINとか使ったこと無いので、調べて試してみます。