mysql のクエリ構文についての相談です


| id | moge | ← カラム名です
| 01 | 002 |
| 02 | 100 |
| 03 | 010 |
| 01 | 003 |
| 02 | 102 |
| 03 | 012 |
| 01 | 001 |
| 02 | 101 |
| 03 | 011 |

に対してクエリを投げて、各idの中で一番mogeの値が大きい行を全て取得したいと考えています。つまり欲しい結果は下記になります。
| 01 | 003 |
| 02 | 102 |
| 03 | 012 |

このため下記のクエリを考えたのですが、
SELECT * FROM <table名> GROUP BY ID ORDER BY moge DESC;
これをするとORDER BYの前にGROUP BYで同一IDが纏められてしまい、正しくソートが働かないようです。

お手数ですが正しく結果を取得するためのクエリをご教授いただければ幸いです。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/12/13 19:17:53
  • 終了:2011/12/13 20:02:57

ベストアンサー

id:nattow No.2

nattow回答回数102ベストアンサー獲得回数272011/12/13 19:28:34

ポイント94pt
SELECT ID, max(moge) FROM <table名> GROUP BY ID ORDER BY ID;

でどうでしょうか。

その他の回答(2件)

id:taknt No.1

きゃづみぃ回答回数13537ベストアンサー獲得回数11982011/12/13 19:22:08

ポイント40pt

SELECT * FROM ( SELECT * FROM <table名> GROUP BY ID ) ORDER BY moge DESC;

というように 集計したものを ソートしたらいかがでしょうか?

他1件のコメントを見る
id:taknt

質問の内容を そのまま 変えたけど 実際は ORDER BY id; じゃないのかなー。

2011/12/13 19:34:21
id:taknt

>内側の括弧内のGROUP BYでmogeが小さいものが残るように適用されたりしないですかね・・

全部出ますよ。

2011/12/13 20:40:34
id:nattow No.2

nattow回答回数102ベストアンサー獲得回数272011/12/13 19:28:34ここでベストアンサー

ポイント94pt
SELECT ID, max(moge) FROM <table名> GROUP BY ID ORDER BY ID;

でどうでしょうか。

id:kodairabase No.3

kodairabase回答回数661ベストアンサー獲得回数802011/12/13 19:37:26

ポイント66pt
SELECT id, MAX(moge) FROM テーブル名 GROUP BY id ORDER BY id;
  • id:n_maco2
    皆様ご回答ありがとうございました。
    結局下記のようなクエリで目的が達成できました。

    select * from <table名> GROUP BY id DESC ORDER BY moge DESC ;

    nattowさんのご回答で質問にあった意図のクエリにはなったと思うのですが、大変申し訳ないのですがmax値が欲しいのではなく、その行にあるデータが丸々欲しかった(質問のために他の列を省いてしまったのです・・)ため、上記のようなクエリにいたしました。

    皆様、ご回答いただきありがとうございました。
  • id:windofjuly
    うぃんど 2011/12/13 21:47:47
    >select * from <table名> GROUP BY id DESC ORDER BY moge DESC ;
    えっ!?それではエラーになるはずですよ

    >その行にあるデータが丸々欲しかった
    それくらい読み取れないで回答してる人が多いって事は嘆かわしいですね

    回答投稿したら終わってたけど、サンプル付き一例残しておきます
    >|sql|
    CREATE TEMPORARY TABLE q1323771618(id int, moge int);
    INSERT INTO q1323771618 VALUES(01 , 002)
    ,(02 , 100)
    ,(03 , 010)
    ,(01 , 003)
    ,(02 , 102)
    ,(03 , 012)
    ,(01 , 001)
    ,(02 , 101)
    ,(03 , 011);
    SELECT * FROM ( SELECT * FROM q1323771618 ORDER BY id, moge DESC) a GROUP BY id;
    ||<
    q1323771618の部分には実際に使っているテーブル名を入れます
    サブクエリにはエイリアス(例ではa)を付けないとエラーになります

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません