2012-07-22 6 views
0

MySQL을 쿼리하려고합니다. 내가 3 개 테이블이 있다고 상상 데이터는 다음과 같이 보았다 :날짜 범위에서 MySQL에 가입하십시오.

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 레코드와 가격을 저장하고 싶지 않았다 , 정상화 :이 출력하는 쿼리를 만들려고

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 | 
+----------+----------+ 

그리고 다. 문제는 판매 된 레코드를 가격과 결합시키는 최선의 방법이 확실하지 않다는 것입니다.

+0

이 apple_id –

+0

와 3 표를 결합하면 apples_sold 테이블에 priceID를 저장 한 후 가입하실 수 있습니다 그것은 – Vatev

+0

당신이 당신의 데이터 구조를 변경할 수에 ? 가격 내역 테이블은 천천히 변화하는 차원의 예입니다. 각 레코드에 유효 날짜와 종료 날짜가 모두있는 경우 쿼리가 쉽습니다. –

답변

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

관련 문제