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。不仅有一个有效日期,还有一个结束日期。使用effdateenddate列,查询会更快更简单。

于 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 回答