mysql:15338
From: 遠藤 俊裕 <遠藤 俊裕 <endo@xxxxxxxxxx>>
Date: Tue, 08 Jun 2010 15:28:56 +0900
Subject: [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@xxxxxxxxxx> さんは書きました: > 坂井です > > 遠藤さんだったら、ここまで来たら自力で解決してほしかったなー > と思いながら(笑): > > 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> > > -- えんどう endo@xxxxxxxxxx,endo@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]