2014-06-10 2 views
0

아래 표와 데이터를 사용하면 현재 effective_from 값이 고유 한 brand/model 조합 당 현재 시간 소인보다 작아집니다. 즉, 항목 당 현재 가격입니다.최대 값 (조건 포함)이있는 고유 한 행 선택

CREATE TABLE things 
(`id` int, `brand` varchar(1), `model` varchar(5), `effective_from` int, `price` int); 

INSERT INTO things 
(`id`, `brand`, `model`, `effective_from`, `price`) 
VALUES 
(1, 'a', 'red', 1402351200, 100), 
(2, 'b', 'red', 1402351200, 110), 
(3, 'a', 'green', 1402391200, 120), 
(4, 'b', 'blue', 1402951200, 115), 
(5, 'a', 'red', 1409351200, 150), 
(6, 'a', 'blue', 1902351200, 140), 
(7, 'b', 'green', 1402358200, 135), 
(8, 'b', 'blue', 1902358200, 155), 
(9, 'b', 'red', 1902751200, 200), 
(10, 'a', 'red', 1908351200, 210), 
(11, 'a', 'red', 1402264800, 660); 

은 지금까지 나는 내가 특정 brand/model 조합에 대한 조건을 추가 할 때 찾고 있어요 행을 얻을 수 있었다, 그러나 모든 고유 행 조합의 현재 가격을 인출하는 방법을 모르겠어요.

SELECT * 
FROM things 
WHERE effective_from<UNIX_TIMESTAMP() 
AND brand='a' 
AND model='red' 
ORDER BY effective_from DESC 
LIMIT 1; 

현재 타임 스탬프가 있었다면 1402404432 다음과 같은 결과가 있어야한다 :

(1, 'a', 'red', 1402351200, 100), 
(3, 'a', 'green', 1402391200, 120), 
(2, 'b', 'red', 1402351200, 110), 
(7, 'b', 'green', 1402358200, 135), 
+0

원하는 결과는 어떻게 생깁니 까? – Strawberry

+0

예상되는 결과를 추가했습니다. – user2959229

+0

나는 당신을 때렸습니다 ;-) – Strawberry

답변

2

난 당신이 후 것 같아요. 그렇지 않으면 조언하십시오 ...

SELECT x.* 
    FROM things x 
    JOIN 
    (SELECT brand 
      , model 
      , MAX(effective_from) max_effective_from 
     FROM things 
     WHERE effective_from <= UNIX_TIMESTAMP() 
     GROUP 
      BY brand 
      , model 
    ) y 
    ON y.brand = x.brand 
    AND y.model = x.model 
    AND y.max_effective_from = x.effective_from; 
+------+-------+-------+----------------+-------+ 
| id | brand | model | effective_from | price | 
+------+-------+-------+----------------+-------+ 
| 1 | a  | red |  1402351200 | 100 | 
| 2 | b  | red |  1402351200 | 110 | 
| 3 | a  | green |  1402391200 | 120 | 
| 7 | b  | green |  1402358200 | 135 | 
+------+-------+-------+----------------+-------+ 

SELECT UNIX_TIMESTAMP(); 
+------------------+ 
| UNIX_TIMESTAMP() | 
+------------------+ 
|  1402404432 | 
+------------------+ 
+0

왜'JOIN'입니까? 내부 질의는 저에게 제가 찾고있는 결과를 제공합니다 ... – user2959229

+1

어쩌면 다른 열을 원할 수도 있습니다. – Strawberry