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
となります。
よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/07/20 11:25:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:nattow No.1

回答回数102ベストアンサー獲得回数27

ポイント50pt

明示されていなかったので、テーブル名を "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 より小さいものをとれば最大二つずつ取れる仕組みです。

id:inosisibeyan No.2

回答回数211ベストアンサー獲得回数0

ポイント50pt

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

コメントはまだありません

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

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

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

回答リクエストを送信したユーザーはいません