2012-08-22 1 views
1

에 따라 마지막 n 레코드를 선택 :mysql을 - 나는 같은 구조로 자동차 가격을 저장하는 테이블이 열

+-----------------+--------------+------+-----+---------+----------------+ 
| Field   | Type   | Null | Key | Default | Extra   | 
+-----------------+--------------+------+-----+---------+----------------+ 
| id    | int(11)  | NO | PRI | NULL | auto_increment | 
| model   | varchar(255) | YES |  | NULL |    | 
| make   | varchar(255) | YES |  | NULL |    | 
| year   | varchar(255) | YES |  | NULL |    | 
| avg_price  | decimal(8,2) | YES |  | NULL |    | 
| median_price | decimal(8,2) | YES |  | NULL |    | 
| created_at  | datetime  | YES |  | NULL |    | 
| updated_at  | datetime  | YES |  | NULL |    | 
+-----------------+--------------+------+-----+---------+----------------+ 

데이터를 해당 연도가 서로 다른 시간에 삽입 할 수 있습니다합니다.

For example model 'Honda', make 'Accord' might have results like: 
+------+-----------+--------------+--------+---------------------+ 
| year | avg_price | median_price | model | created_at   | 
+------+-----------+--------------+--------+---------------------+ 
| 1992 | 2431.29 |  2000.00 | accord | 2012-02-23 17:31:41 | 
| 1993 | 2609.13 |  2195.00 | accord | 2012-02-23 17:31:44 | 
| 1994 | 2858.81 |  2400.00 | accord | 2012-02-23 17:31:44 | 
| 2000 | 4771.99 |  4450.00 | accord | 2012-02-23 17:31:46 | 
| 2001 | 5260.16 |  5000.00 | accord | 2012-02-23 17:31:46 | 
| 2000 | 4860.19 |  4795.00 | accord | 2012-08-15 06:09:52 | 
| 2001 | 5071.49 |  4990.00 | accord | 2012-08-15 06:09:52 | 
| 2002 | 5872.80 |  5795.00 | accord | 2012-08-15 06:09:52 | 
| 2003 | 7521.44 |  7950.00 | accord | 2012-08-15 06:09:52 | 
| 2004 | 8348.19 |  8495.00 | accord | 2012-08-15 06:09:52 | 

나는 자동차 제조 년 동안 가장 최근의 모든 혼다 어코드 데이터를 검색하고 싶습니다.

그래서 위의 예에서 2012 년 8 월 15 일 06:09:52에서 데이터를 검색하고 싶습니다. 20002001200220032004 년 동안 더 오래된 연도는 2012 년부터 2012 년까지입니다. 02-23 17시 31분 41초

select year,avg_price,median_price,model,created_at 
from car_prices 
where make='honda' and model= 'accord' group by year asc 

위의 쿼리는 매년 삽입 매년 구별 데이터가 아니라 마지막 레코드를 가져옵니다.

최신 아이디어뿐만 아니라 매년 별개의 데이터를 얻는 방법에 대한 아이디어가 있으십니까?

답변

1

, 당신은 조회를 작성하고 그에 가입해야합니다.

주어진 make, model, year 그룹에 대해 가장 최근의 created_at 값을 찾고 싶습니다. 아래 코드의 하위 쿼리가이를 수행합니다.

그런 다음 make, model, year, created_at 값을 가진 레코드 만 찾으면 원래 데이터에 다시 합류합니다.

이것은 동일한 make, model, year, created_at 값을 가진 레코드가 두 개 이상 있음을 의미하므로, make, model, year에 대한 여러 결과가 표시됩니다.

가장 최근의 created_at에 대한 검색과 조인을 위해 인덱스가 (make, model, year, created_at) 인 지 확인하십시오.

SELECT 
    * 
FROM 
    car_prices 
INNER JOIN 
(
    SELECT 
    make, model, year, MAX(created_at) as created_at 
    FROM 
    car_prices 
    GROUP BY 
    make, model, year 
) 
    AS most_recent 
    ON car_prices.make  = most_recent.make 
    AND car_prices.model  = most_recent.model 
    AND car_prices.year  = most_recent.year 
    AND car_prices.created_at = most_recent.created_at 
WHERE 
     most_recent.make = 'honda' 
    AND most_recent.model = 'accord' 
1
select * from(
select year,avg_price,median_price,model,created_at 
from car_prices 
where make='honda' and model= 'accord'  
order by created_at desc,year desc) m 
group by year asc 
성능과 guarnanteed 행동 모두에 대한
+0

아니, 문제가 해결되지 않습니다. 수정 한 후에도 SQL을 입력 한 후 그룹별로 입력하면 – truthSeekr

+1

이 수정되었습니다. 시도해보십시오. 하위 쿼리를 시도 할 수 있습니다. – sel

+0

Neat. 훌륭하게 작동합니다. 고마워요. – truthSeekr

2
SELECT p.* 
FROM car_prices p 
JOIN (SELECT year, MAX(created_at) latest 
     FROM car_prices 
     WHERE make = 'honda' AND model = 'accord' 
     GROUP BY year) mp 
ON p.year = mp.year AND p.created_at = mp.latest 
WHERE p.make = 'honda' AND p.model = 'accord' 
0

기본적으로 0으로 설정되는 새로운 부울 열을 추가하십시오. 나는 다음을 사용한다 : is_old. 새로운, 모델, 년간 가격을 삽입 할 때

| is_old   | TINYINT(1) | NO |  | 0 |    | 

, 내가 먼저 수행

UPDATE car_prices 
    SET `is_old`=1 
WHERE 
    `make`='make_to_insert' AND 
    `model`='model_to_insert' AND 
    `year`='year_to_insert'; 

는 다음 나는 새 행을 삽입합니다. 최근 가격을 얻으려면

은 간단하다 :

SELECT * FROM car_prices 
WHERE `is_old` = 0; 

그리고 샘플 쿼리는 다음과 같습니다

SELECT * FROM 
    car_prices 
WHERE 
     make = 'honda' 
    AND model = 'accord' 
    AND is_old = 0; 
관련 문제