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

mysql:15337

From: SAKAI Kei <SAKAI Kei <sak2@xxxxxxxxxx>>
Date: Tue, 08 Jun 2010 13:54:52 +0900
Subject: [mysql 15337] Re: 【お知恵拝借】副問い合わせに limit 3

坂井です

  遠藤さんだったら、ここまで来たら自力で解決してほしかったなー
  と思いながら(笑):
  
SELECT a.id, a.field, a.ordfield, COUNT(b.id)+1 cnt
  FROM tbl a LEFT OUTER JOIN tbl b 
             ON a.field=b.field AND a.ordfield>b.ordfield
 GROUP BY a.id, a.field, a.ordfield
 HAVING cnt<=3
 ORDER BY a.field, cnt, id;
  
  field 値2の4件については与えられた条件ではまったく対等なので
  ここから(適当に)3件のみを表示するということはできません。
  3つ以上の場合はidの若いもの3つ、ということならば、上記と同様
  の考え方でもう一段、id用の順序づけを行うことでできると思います。
  

>>木村さん

  期待した順番に並ばないのは、GROUP BY での指定順序のせいではなく
  ORDER BY を指定していないためではないでしょうか。
  (GROUP BY の指定順序でもおそらく内部処理の仕組みから、整列され
    たレコードを得られると思うのですが、仕様上順序は「不定」だと
    思います)

Thank you
On Tue, 08 Jun 2010 10:45:56 +0900
遠藤 俊裕 <endo@xxxxxxxxxx> wrote:
> 遠藤です。
> 
> こんな感じです。
> カテゴリの 2 が出ない・・・
> 
> drop table tbl;
> 
> create table tbl
> (
> id int auto_increment primary key,
>   field int,
>   ordfield int
> );
> 
> INSERT INTO `tbl` 
> (`id`, `field`, `ordfield`) VALUES 
> (NULL, '0', '1'), (NULL, '1', '11'), (NULL, '2', '1'),
> (NULL, '0', '2'), (NULL, '1', '22'), (NULL, '2', '1'),
> (NULL, '0', '3'), (NULL, '1', '33'), (NULL, '2', '1'),
> (NULL, '0', '4'), (NULL, '1', '44'), (NULL, '2', '1');
> 
> SELECT t1.id, t1.field, t1.ordfield
> FROM tbl t1
> INNER JOIN tbl t2 ON t1.field = t2.field AND t1.ordfield >= t2.ordfield
> GROUP BY t1.field, t1.ordfield, t1.id
> HAVING count(*) <= 3;
> 
> Tue, 8 Jun 2010 06:55:52 +0900 (JST) に、
> "KIMURA, Meiji" <kimura804@xxxxxxxxxx> さんは書きました:
> 
> > 木村です。
> > 
> > --- 遠藤 俊裕 <endo@xxxxxxxxxx> wrote:
> > 
> > > 遠藤です。
> > > 
> > > これ、ordfield が同一の時、どうなりますかね?
> > > なんか、変な動きしますかね・・・・
> > > なんか、変っぽい・・・
> > 
> > INSERT INTO `carelabo_portal`.`tbl` 
> > (`id`, `field`, `ordfield`) VALUES 
> > (NULL, '0', '1');
> > 
> > +----+-------+----------+
> > | id | field | ordfield |
> > +----+-------+----------+
> > |  1 |     0 |        1 |
> > |  4 |     0 |        2 |
> > | 13 |     0 |        1 |←ここがヘン?
> > |  2 |     1 |       11 |
> > |  5 |     1 |       22 |
> > |  8 |     1 |       33 |
> > |  3 |     2 |       55 |
> > |  6 |     2 |       66 |
> > |  9 |     2 |       77 |
> > +----+-------+----------+
> > 9 rows in set (0.00 sec)
> > 
> > 一行増やすとこんな感じですね。あらgroup byの順番間違ってました。
> > field, ordfield, idの順にしないとだめですね。修正するとこんな感じです。
> > 
> > mysql> SELECT t1.id, t1.field, t1.ordfield
> >     -> FROM tbl t1
> >     -> INNER JOIN tbl t2 ON t1.field = t2.field AND t1.ordfield >= t2.ordfield
> >     -> GROUP BY t1.field, t1.ordfield, t1.id
> >     -> HAVING count(*) <= 3;
> > +----+-------+----------+
> > | id | field | ordfield |
> > +----+-------+----------+
> > |  1 |     0 |        1 |
> > | 13 |     0 |        1 |
> > |  4 |     0 |        2 |
> > |  2 |     1 |       11 |
> > |  5 |     1 |       22 |
> > |  8 |     1 |       33 |
> > |  3 |     2 |       55 |
> > |  6 |     2 |       66 |
> > |  9 |     2 |       77 |
> > +----+-------+----------+
> > 9 rows in set (0.00 sec)
> > 
> > > Tue, 8 Jun 2010 00:06:41 +0900 (JST) に、
> > > "KIMURA, Meiji" <kimura804@xxxxxxxxxx> さんは書きました:
> > > 
> > > > こんばんわ、木村です。
> > > > 
> > > > 自己結合とgroup by, havingでこんなんでどうですかね。
> > > > 
> > > > mysql> SELECT t1.id, t1.field, t1.ordfield
> > > >     -> FROM tbl t1
> > > >     -> INNER JOIN tbl t2 ON t1.field = t2.field AND t1.ordfield >= t2.ordfield
> > > >     -> GROUP BY t1.field, t1.id, t1.ordfield
> > > >     -> HAVING count(*) <= 3;
> > > > +----+-------+----------+
> > > > | id | field | ordfield |
> > > > +----+-------+----------+
> > > > |  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 |
> > > > +----+-------+----------+
> > > > 9 rows in set (0.00 sec)
> > > > 
> > > > ただパフォーマンスは、これだとあまり良さそうにないですが。。。。。
> > > > 
> > > > --- 遠藤 俊裕 <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 毎に)発行して、プログラムでがっ
> > > > > ちゃんこしてます。ちょっと、不細工・・・(^^;
> > 
> > 
> > 
> > --
> > キムラデービー代表 木村明治(KIMURA, Meiji)
> > http://kimuradb.com
> > [News] 2009/12/10(木) Firebird徹底入門発売!現在絶賛販売中!!
> > http://www.amazon.co.jp/exec/obidos/ASIN/4798119636/kimuradb-22
> > 
> 
> --
> えんどう
> 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]