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

mysql:15340

From: "KIMURA, Meiji" <"KIMURA, Meiji" <kimura804@xxxxxxxxxx>>
Date: Tue, 8 Jun 2010 23:00:38 +0900 (JST)
Subject: [mysql 15340] Re: 【お知恵拝借】副問い合わせに limit 3

木村です。


--- 遠藤 俊裕 <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;

遠藤さんMySQL 5.1.xを使っているということで、
ストアドプロシジャを使って、内部でアプリっぽいロジックとlimit 3をしこみました。

DELIMITER |
CREATE PROCEDURE ordfield_top3()
BEGIN
    DECLARE v_last_row INT DEFAULT 0;
    DECLARE v_field INT;
    DECLARE tbl_cur CURSOR FOR SELECT field FROM tbl GROUP BY field;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_last_row=1;

    DROP TEMPORARY TABLE IF EXISTS t_tbl;
    CREATE TEMPORARY TABLE t_tbl LIKE tbl;
 
    OPEN tbl_cur;
    tbl_loop:LOOP
        FETCH tbl_cur INTO v_field;
        IF (v_last_row=1) THEN
            LEAVE tbl_loop;
        END IF;
        INSERT INTO t_tbl SELECT * FROM tbl WHERE field = v_field ORDER BY field, ordfield limit 3;
    END LOOP;
    CLOSE tbl_cur;

    SELECT * FROM t_tbl ORDER BY field, ordfield, id;
END|
DELIMITER ;

実行結果はこんな感じ。

mysql> call ordfield_top3();
+----+-------+----------+
| id | field | ordfield |
+----+-------+----------+
|  1 |     0 |        1 |
|  4 |     0 |        2 |
|  7 |     0 |        3 |
|  2 |     1 |       11 |
|  5 |     1 |       22 |
|  8 |     1 |       33 |
|  3 |     2 |        1 |
|  6 |     2 |        1 |
|  9 |     2 |        1 |
+----+-------+----------+

プロシジャの中でやっていることはベタですが、ちゃんと適切なインデックスを
はってあれば、そんなに遅くないし、件数が増えてもあまりパフォーマンス上の
問題はおきないと思います。。。。



--
キムラデービー代表 木村明治(KIMURA, Meiji)
http://kimuradb.com
[News] 2009/12/10(木) Firebird徹底入門発売!現在絶賛販売中!!
http://www.amazon.co.jp/exec/obidos/ASIN/4798119636/kimuradb-22

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

     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]