人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

MySQLのクエリについて

以下のようなテーブルがあります。
aaa,str1
aaa,str2
bbb,str3
ccc,str4
ccc,str5
ccc,stt6
ddd,str7

のように第1項には、ユニークではない、かつ何種類あるか分からない(重複を除いた場合何件のレコードがあるか分からない)の文字列が入っています。第1項すべてのパターンに対して上から最大2件データを取得したいのですがどのようなSQL文を書けばよいでしょうか。

上記のテーブルに対して求める結果は
aaa,str1
aaa,str2
bbb,str3
ccc,str4
ccc,str5
ddd,str7
となります。

また、以下のテーブルがあったら
aaa,str1
aaa,str2
aaa,str3
ttt,str4
ttt,str5
rrr,str6
rrr,str7
rrr,str8
求める結果は
aaa,str1
aaa,str2
ttt,str4
ttt,str5
rrr,str6
rrr,str7
となります。
よろしくお願いします。

●質問者: after_333sec
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● nattow
●50ポイント

明示されていなかったので、テーブル名を "test"、第1項を "ID"、第2項を "VAL" にしています。
適宜置き換えてください。

まず回答から。

select
 t.ID,
 t.VAL
from
 (select
 (case when @p <> ID then (@c := 0) end) c,
 (@c := @c + 1) no,
 (@p := ID) pr,
 ID,
 VAL
 from test
 order by ID
) t
where t.no < 3;

以下、(簡単にですが)解説です。

まず以下の部分で

 select
 (case when @p <> ID then (@c := 0) end) c,
 (@c := @c + 1) no,
 (@p := ID) pr,
 ID,
 VAL
 from test
 order by ID

ID が同じものの間で連番が振られるようにしてます。
そこから、連番が 3 より小さいものをとれば最大二つずつ取れる仕組みです。


2 ● inosisibeyan
●50ポイント

1、先ず、先頭フールドでユニーク化して第二フールドの先頭レコードの抽出。
2、元のテーブルから1結果のテーブルのデータ以外を抽出し、その結果の先頭レコードを抽出。
3、ユニオンクエリで1,2を連結し、ソートする。

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ