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]