[前][次][番号順一覧][スレッド一覧]

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]