2012-07-22 63 views
0

我在查询MySQL。说我有3个表和想象中的数据是这样的:在日期范围内加入MySQL

apples_sold 
+--------+------------+----------+------+ 
| tranID | date  | apple_id | sold | 
+--------+------------+----------+------+ 
| 101 | 2012-07-01 |  a01 | 2 | 
| 102 | 2012-07-02 |  a01 | 5 | 
| 103 | 2012-07-03 |  a01 | 1 | 
| 104 | 2012-07-04 |  a01 | 0 | 
| 105 | 2012-07-05 |  a01 | 2 | 
+--------+------------+----------+------+ 

price_history 
+---------+------------+----------+-------+ 
| priceID | date  | apple_id | price | 
+---------+------------+----------+-------+ 
|  p01 | 2012-07-01 |  a01 | $0.25 | 
|  p02 | 2012-07-03 |  a01 | $0.10 | <- price change 
+---------+------------+----------+-------+ 

apple_name 
+----------+----------+ 
| apple_id | name  | 
+----------+----------+ 
|  a01 | McIntosh | 
+----------+----------+ 

试图创建输出这样的查询:

apple_prices 
+------------+----------+-------+ 
| date  | name  | price | 
+------------+----------+-------+ 
| 2012-07-01 | McIntosh | $0.25 | 
| 2012-07-02 | McIntosh | $0.25 | 
| 2012-07-03 | McIntosh | $0.10 | <- price change 
| 2012-07-04 | McIntosh | $0.10 | 
| 2012-07-05 | McIntosh | $0.10 | 
+------------+----------+-------+ 

没有希望的价格存储与apples_sold记录,正常化和所有。问题在于我不能确定将销售记录与价格结合的最佳方式。

+0

加入与apple_id – 2012-07-22 00:05:29

+0

3个表,你可以在priceID存储在apples_sold表,然后加入就可以了 – Vatev 2012-07-22 00:14:51

+0

你可以改变你的数据结构?您的价格历史记录表格是缓慢变化维度的示例。当每条记录上都有生效日期和结束日期时,查询更容易。 – 2012-07-22 17:07:53

回答

5

您可以使用:

SELECT a.date, d.name, c.price 
FROM apples_sold a 
INNER JOIN 
(
    SELECT a.date, MAX(b.date) AS maxdate 
    FROM apples_sold a 
    INNER JOIN price_history b ON a.date >= b.date 
    GROUP BY a.date 
) b ON a.date = b.date 
INNER JOIN price_history c ON b.maxdate = c.date 
INNER JOIN apple_name d ON a.apple_id = d.apple_id 

SQLFiddle Demo