1

次のような構造の車の価格を格納するテーブルがあります。

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

その車種の最新のホンダ アコード データをすべて取得したいと思います。

上記の例では、2000、2001、2002、2003、2004 年の 2012-08-15 06:09:52 からデータを取得したいと思いますが、それより古い年は 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

上記のクエリは、年ごとに個別のデータを取得しますが、年ごとに挿入された最後のレコードは取得しません。

毎年と最新のデータを取得する方法はありますか?

4

4 に答える 4

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'
于 2012-08-22T07:19:22.790 に答える
1

パフォーマンスと保証された動作の両方について、ルックアップを作成してそれに参加する必要があります。

created_atあなたの場合、特定のグループの最新の値を見つけたいと考えていますmake, model, year。以下のコードのサブクエリはそれを行います。

次に、それを元のデータに再び結合して、それらのmake, model, year, created_at値を持つレコードのみを見つけます。

これは、同じmake, model, year, created_at値を持つレコードが複数ある場合、そのレコードに対して複数の結果が得られることを意味しますmake, model, year

(make, model, year, created_at)結合だけでなく、最新の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'
于 2012-08-22T07:22:18.203 に答える
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
于 2012-08-22T07:01:29.863 に答える