mysql:15332
From: SAKAI Kei <SAKAI Kei <sak2@xxxxxxxxxx>>
Date: Tue, 08 Jun 2010 00:47:09 +0900
Subject: [mysql 15332] Re: 【お知恵拝借】副問い合わせに limit 3
坂井です 試行錯誤していたら、木村さんに先を越されてしまいました。 結果としてほとんど同じものなのですが、せっかくなので、 別解ということでメールします。 SELECT a.id, a.field, a.ordfield, COUNT(*) FROM tbl a, tbl b WHERE a.field=b.field AND a.ordfield>=b.ordfield GROUP BY a.id, a.field, a.ordfield HAVING COUNT(*)<=3 ORDER BY a.field, COUNT(*); WHERE に結合条件を書くのは最近あまりハヤりでない(結合条件は JOINで明示したほうがわかりやすい)と聞いたことがありますが、 どうも私はこのほうが直感的なんですよね(^^; #一応、要件に沿って ORDER BY しているところだけは胸を張れるかも。 #私は抽出フィールドとして COUNT(*) を書いてしまいましたが、 #明示しなくても HAVING 句やORDER BY 句の中で使用可能なんですね! Thank you On Mon, 07 Jun 2010 22:33:31 +0900 遠藤 俊裕 <endo@xxxxxxxxxx> wrote: > えんどうです。 > お返事有り難うございました。 > > create table tbl > ( > id int auto_increment primary key, > field int, > ordfield int > ); > > INSERT INTO `carelabo_portal`.`tbl` > (`id`, `field`, `ordfield`) VALUES > (NULL, '0', '1'), (NULL, '1', '11'), (NULL, '2', '55'), > (NULL, '0', '2'), (NULL, '1', '22'), (NULL, '2', '66'), > (NULL, '0', '3'), (NULL, '1', '33'), (NULL, '2', '77'), > (NULL, '0', '4'), (NULL, '1', '44'), (NULL, '2', '88'); > > で、実行した時、 > > 1, 0, 1 > 4, 0, 2 > 7, 0, 3 > 2, 1, 11 > 5, 1, 22 > 8, 1, 33 > 3, 2, 55 > 6, 2, 66 > 9, 2, 77 > > (おそらく)上記が出て欲しいです。 > データがダミーなので、おそらくと書きましたが、なんせ、グ > ループ(field)毎に(ordfiledの)トップ3が出れば嬉しい > のです。 > > 今は、3回 SQL を( field 毎に)発行して、プログラムでがっ > ちゃんこしてます。ちょっと、不細工・・・(^^; > > Mon, 07 Jun 2010 22:00:27 +0900 に、 > Miyata Masaki <catlover@xxxxxxxxxx> さんは書きました: > > > ミヤタと申します。 > > > > > どなたか、上記 SQL の結果を実現する方法をお教え下さい。 > > > > 実現したい動作がよく分からないので、このあたりを付けて頂けると分り易いかと。 > > ・DDL文 > > ・INSERT文(数件程度) > > ・想定結果 > > > > -- > > Masaki Miyata > > catlover@xxxxxxxxxx > > > > > From: 遠藤 俊裕 <endo@xxxxxxxxxx> > > > To: ml@xxxxxxxxxx > > > Subject: [mysql 15328] 【お知恵拝借】副問い合わせに limit 3 > > > Date: 2010/06/07 21:41 > > > > > > えんどうです。 > > > > > > 皆様、お知恵を拝借させて下さい。 > > > > > > tbl の中の field ごとに top 3 を出したいために、以下の SQL > > > を書いてみました。 > > > > > > select * from tbl as t1 > > > where id in > > > ( > > > select id from tbl as t2 > > > where t1.field = t2.field > > > order by ordfield > > > limit 3 > > > ) > > > order by ordfield > > > > > > ダメでした。 > > > > > > どうも、in の中で limit が使えない様です。 > > > > > > どなたか、上記 SQL の結果を実現する方法をお教え下さい。 > > > > > > 何卒よろしくお願い致します。 > > > > > > MySQL version = 5.1.44 > > > > > > -- > > > えんどう > > > endo@xxxxxxxxxx,endo@xxxxxxxxxx > > > > > > > > > > -- > えんどう > endo@xxxxxxxxxx,endo@xxxxxxxxxx > -- SAKAI Kei <sak2@xxxxxxxxxx>
15328 2010-06-07 21:41 [遠藤 俊裕 <endo@xxxx] 【お知恵拝借】副問い合わせに limit 3 15329 2010-06-07 22:00 ┗[Miyata Masaki <catlo] 15330 2010-06-07 22:33 ┗[遠藤 俊裕 <endo@xxxx] 15331 2010-06-08 00:06 ┣["KIMURA, Meiji" <kim] 15334 2010-06-08 01:48 ┃┗[遠藤 俊裕 <endo@xxxx] 15335 2010-06-08 06:55 ┃ ┗["KIMURA, Meiji" <kim] 15336 2010-06-08 10:45 ┃ ┗[遠藤 俊裕 <endo@xxxx] 15337 2010-06-08 13:54 ┃ ┣[SAKAI Kei <sak2@xxxx] 15338 2010-06-08 15:28 ┃ ┃┣[遠藤 俊裕 <endo@xxxx] 15339 2010-06-08 21:56 ┃ ┃┗["KIMURA, Meiji" <kim] 15340 2010-06-08 23:00 ┃ ┗["KIMURA, Meiji" <kim] -> 15332 2010-06-08 00:47 ┣[SAKAI Kei <sak2@xxxx] 15333 2010-06-08 01:16 ┗[遠藤 俊裕 <endo@xxxx]