2010年6月 8日

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

遠藤です。

坂井さん、いつもいつも有り難うございますm(_ _)m

いやいや、完全に思考回路止まってます。
すんません。教えて君になってました。

それにしても、limit 3 が使えれば簡単なのに・・・ぶつぶつ。


下記方法でも可能ですが、さらに多段になると嫌になっちゃい
そうなので、データの方をどうにかする事でなんとかしてみよ
うと思います。
実際の所、ここは TIMESTAMP か DATETIME 型にして、更新頻
度も1レコード/1秒を上回る状態を作らなければ、なんとか
なる気がしています。

何をしたかったかと言えば、そのまま、カテゴリ毎に登録順に
新しいものから3件ずつを表示するためだけに考えてました。
プログラムで実現すれば簡単なんだけど、折角 CakePHP を使っ
ていつのでアソシエーションでも使おうかと、JOIN を考えて
いました。
ところが、自分自身のモデルにアソシエーションする方法が分
からず(ってか、研究不足)で、結構諦め加減です。

今は、そのままクエリーにぶち込んでいます(^^;

ある程度こなれてきたら、より良い方法を探す事を検討してみ
たいと思います。

数々有り難うございましたm(_ _)m

Tue, 08 Jun 2010 13:54:52 +0900 に、
SAKAI Kei <sak2@xxxxx> さんは書きました:

> 坂井です
>
> 遠藤さんだったら、ここまで来たら自力で解決してほしかったなー
> と思いながら(笑):
>
> 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@xxxxx> 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@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
> >
>
> --
> SAKAI Kei <sak2@xxxxx>
>
>

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

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




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