次のようなテーブルがあります。
create table company
(
id int(10) unsigned not null auto_increment,
name varchar(50) not null,
primary key (id)
);
create table invoice
(
id int(10) unsigned not null auto_increment,
company_id int(10) unsigned not null,
invoice_number varchar(50) not null,
paid_date datetime not null,
paid_amount decimal(10, 2) not null,
primary key (id),
foreign key (company_id) references company(id)
);
create table company_rate
(
id int(10) unsigned not null auto_increment,
company_id int(10) unsigned not null,
rate decimal(10, 2) not null,
effective_date datetime not null,
primary key (id),
foreign key (company_id) references company(id)
);
Company テーブルには、会社の名前が保持されます。Invoice テーブルには、請求書番号、会社が支払われる日付、および金額が保持されます。会社のレート テーブルには、レートと、レートが有効になる開始日が保持されます。例えば、
company_id rate effective_date
-------------------------------------
1 100 0000-00-00
1 350 2013-07-01
1 450 2013-07-20
1 500 2014-01-01
現在の日付が 07-03 の場合、レートは 350 で、日付が 09-21 の場合、レートは 450 などです。
これらのテーブルに基づいて 2 つの関数を作成しようとしています。
1つは、会社を選択して請求書を作成し、HTMLフォームなどを使用して発効日に基づいて現在のレートを表示することです。
もう1つは、次のようなリストを作成することです。
company_name invoice_number rate paid_amount paid_date
-------------------------------------------------------------------
Apple 12345 300 300 2013-01-14
Apple 12346 500 400 2013-05-12
Intel 44441 1200 1350 2013-06-01
請求書情報を出力し、料金はpaid_dateによって決定されます。
これが試されました:
SELECT c.name as company_name, i.invoice_number, r.rate, i.paid_amount, i.paid_date
FROM invoice as i
LEFT JOIN company as c on c.id = i.company_id
LEFT JOIN (
SELECT company_id, rate, effective_date
FROM company_rate
WHERE effective_date IN (
SELECT MAX(effective_date)
FROM company_rate
GROUP BY company_id
)) AS r ON r.company_id = c.id
AND r.effective_date <= i.paid_date
どうすればこれを達成できますか?