次のようなジョブテーブルがあります。
**jobs**
job_id | customer_id | date
------------------------------------
| 1 | 1 | 2012-01-03 |
| 2 | 2 | 2013-02-04 |
| 3 | 1 | 2013-03-05 |
| 4 | 3 | 2013-05-04 |
次に、次のような製品テーブルがあります。
**products**
product_id | description | price
-----------------------------------
| 1 | prod_1 | 25.50 |
| 2 | prod_2 | 34.95 |
最後に、価格が変更されると、次のような product_price_changes テーブルがあります。
**product_price_changes**
price_change_id | product_id | price_change_date | old_price
---------------------------------------------------------------
| 1 | 1 | 2013-01-01 | 20.00 |
| 2 | 1 | 2013-02-05 | 23.00 |
(product_id,price_change_date) の UNIQUE INDEX 付き
仕事が完了した日付からの価格を反映した製品価格を取得する VIEW を作成したいと考えています。
上記のデータを使用すると、次のようなテーブルが作成されます。
**view_job_pricing**
job_id | product_id | price
------------------------------
| 1 | 1 | 20.00 |
| 1 | 2 | 34.95 |
| 2 | 1 | 23.00 |
| 2 | 2 | 34.95 |
| 3 | 1 | 25.50 |
| 3 | 2 | 34.95 |
| 4 | 1 | 25.50 |
| 4 | 2 | 34.95 |
そのため、製品価格の変更が存在する場合はジョブ日付よりも前の最高の日付で製品価格の変更を選択する必要があり、存在しない場合は現在の製品価格を取得する必要があります。
私はこれを持っています:
CREATE VIEW view_job_pricing
AS
SELECT j.job_id, p.product_id, MAX(price_change_date),
IFNULL(ppc.old_price,p.price) AS price
FROM products p
JOIN jobs j
LEFT JOIN product_price_changes ppc
ON p.product_id = ppc.product_id AND date < price_change_date
GROUP BY job_id, product_id;
しかし、実際のデータベースではかなり遅いです (はるかに多くのジョブと製品)。より良い方法があるかどうか疑問に思っています。ありがとう!