1

次のようなジョブテーブルがあります。

**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;

しかし、実際のデータベースではかなり遅いです (はるかに多くのジョブと製品)。より良い方法があるかどうか疑問に思っています。ありがとう!

4

2 に答える 2

1

これを相関サブクエリとして実行してみてください。ビューのselect句でサブクエリを使用できます。相関サブクエリでは、製品のインデックスを使用する必要があります。

CREATE VIEW view_job_pricing 
AS
SELECT j.job_id, p.product_id, MAX(price_change_date), 
       coalesce((select ppc.price
                 from product_price_changes ppc
                 where p.product_id = ppc.product_id AND j.date < ppc.price_change_date
                 order by ppc.price_change_date desc
                 limit 1
                ),
                p.price) AS price
FROM products p cross join
     jobs j

テーブルの構造を変更することで、処理を簡素化し、パフォーマンスを向上させることができproduct_price_changesます。effective_date だけでなく、end_date も指定します。effdateおよび列を使用enddateすると、クエリははるかに高速かつ簡単になります。

于 2013-07-19T20:03:19.773 に答える
1

関連するすべての列のインデックスを作成し、EXPLAIN EXTENDED(レビューのためにここに投稿できます)を使用してインデックス作成の結果を確認することに加えて、ビューをCREATE ALGORITHM = MERGE VIEW. これをいつ行うことができるかについては多くの制限があるため、YMMV

[http://dev.mysql.com/doc/refman/5.0/en/create-view.html][1]

于 2013-07-19T20:05:23.373 に答える