2010年6月 8日

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

遠藤です。

こんな感じです。
カテゴリの 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@xxxxx> さんは書きました:

> 木村です。
>
> --- 遠藤 俊裕 <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
>

--
えんどう
endo@xxxxx,endo@xxxxx

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




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