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

mysql:8909

From: ML account <ML account <ml@xxxxxxxxxx>>
Date: Fri, 05 Mar 2004 17:59:01 +0900
Subject: [mysql 08909] Re: 日付検索

 こんにちは。

"infoweb" <fwkn8598@xxxxxxxxxx>さんの
<001201c4027b$bfd2e940$0301a8c0@ryozIBM>
"[mysql 08906] 日付検索"


> やりたいことは本日より過去2ヶ月以内にレポートの登録がある顧客以外の顧
> 客番号、または最新のレポート内容を抽出することです

 少々分かりにくいです。「本日より過去2ヶ月以内にレポートの登録が無い顧
客の番号、及び、その顧客が登録した最新のレポート内容を抽出する」で良いで
すか?
 また、
・レポートを出していない顧客が存在するかどうか。
・日付の境界条件。2ヶ月以内とは具体的には何なのか、2ヶ月前に当日と同じ
  日が無い場合はどうするのか。
・レポートテーブルの一意条件。ある顧客が同日に2本以上のレポートを出す事
  があるのか無いのか。ある場合はどちらかのレポートが取られるのか、両方取
  られるのか。どちらかのレポートの場合、どの様な基準で取られるレポートが
  決まるのか。
等を詰め直す必要があるかもしれません。


 実際の所、max()やmin()等のグループ関数が使われているクエリで、その関数
結果を持つ行の他のカラムを一緒に出すことは、少々面倒だったりします。サブ
クエリ、一時テーブル、プログラム介在での複数クエリ発行のいずれかの出番で
すね。一時テーブルを使うとすれば、この様な感じになるでしょう。

    create table customer (
        cid int not null primary key,
        name varchar(50),
        adrs varchar(50)
    );

    insert into customer(cid,name,adrs) values(1,'ああああ','東京');
    insert into customer(cid,name,adrs) values(2,'いいいい','埼玉');
    insert into customer(cid,name,adrs) values(3,'うううう','千葉');
    insert into customer(cid,name,adrs) values(4,'ええええ','大阪');
    insert into customer(cid,name,adrs) values(5,'おおおお','福岡');

    create table report (
        cid int not null,
        content varchar(50),
        issued datetime,
        index report_cid (cid)
    );

    insert into report(cid,content,issued) values(1,'etc','2004-01-15');
    insert into report(cid,content,issued) values(2,'etc','2003-11-20');
    insert into report(cid,content,issued) values(3,'etc','2003-12-01');
    insert into report(cid,content,issued) values(1,'etc','2003-12-24');
    insert into report(cid,content,issued) values(4,'etc','2004-01-01');
    insert into report(cid,content,issued) values(4,'etc','2003-11-20');
    insert into report(cid,content,issued) values(2,'etc','2003-12-20');
    insert into report(cid,content,issued) values(3,'etc','2003-01-20');

    drop table last_report;

    create temporary table last_report (
        cid int not null primary key,
        last_issued datetime
    );

    insert into last_report (cid,last_issued)
    select customer.cid,max(report.issued) as last_issued
    from customer left join report on customer.cid=report.cid
    group by customer.cid
    having last_issued is null
        or last_issued <= date_sub(now(),interval 2 month);

    select last_report.cid,report.content
    from last_report left join report 
        on last_report.last_issued=report.issued;


 最後のSELECTクエリの結果
    +-----+---------+
    | cid | content |
    +-----+---------+
    |   2 | etc     |
    |   3 | etc     |
    |   4 | etc     |
    |   5 | NULL    |
    +-----+---------+


    松枝知直    <tomom@xxxxxxxxxx>
            http://www.argus.ne.jp/~tomom/



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

      8906 2004-03-05 15:33 ["infoweb" <fwkn8598@] 日付検索                                
      8907 2004-03-05 16:10 ┣["山本 瑞己" <mizuki]                                       
      8908 2004-03-05 16:54 ┃┗["infoweb" <fwkn8598@]                                     
->    8909 2004-03-05 17:59 ┣[ML account <ml@xxxxx]                                       
      8927 2004-03-08 15:58 ┗[<n.futami@xxxxxxxxxx]