2010年6月 8日

[mysql 15335] Re: 【お知恵拝借】副問い合わせに limit 3

木村です。

--- 遠藤 俊裕 <endo@xxxxx> 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@xxxxx> さんは書きました:
>
> > こんばんわ、木村です。
> >
> > 自己結合と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@xxxxx> 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


投稿者 xml-rpc : 2010年6月 8日 06:55
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/96209
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。