mysql-根据列选择最后n条记录
我有一个存储汽车价格的表格,其结构如下:mysql-根据列选择最后n条记录,mysql,sql,Mysql,Sql,我有一个存储汽车价格的表格,其结构如下: +-----------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------------+--------------+------+-----+---------+----------------+ | id
+-----------------+--------------+------+-----+---------+----------------+
| 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-08-15 06:09:52中检索2000200120032004年的数据
但较老的年份将从日期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
上面的查询获取的是每年不同的数据,但不是每年插入的最后一条记录
对于如何获取每年的不同数据以及最新数据,您有什么想法吗?对于性能和guarnanteed行为,您应该创建一个查找并加入其中
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
在您的案例中,您希望为任何给定的品牌、型号、年份
组在处找到最近创建的值。下面代码中的子查询就是这样做的
然后再次将其加入原始数据中,只查找那些具有
make、model、year和created值的记录
这意味着如果您有多条记录具有相同的make,model,year,created_at
值,您将获得该make,model,year
的多个结果
确保您有一个涵盖(品牌、型号、年份、创建时间)的索引
,以便快速搜索最新的创建时间
,以及加入
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'
对于性能和guarnanteed行为,您应该创建一个查找并连接该查找 在您的案例中,您希望为任何给定的
品牌、型号、年份
组在处找到最近创建的值。下面代码中的子查询就是这样做的
然后再次将其加入原始数据中,只查找那些具有
make、model、year和created值的记录
这意味着如果您有多条记录具有相同的make,model,year,created_at
值,您将获得该make,model,year
的多个结果
确保您有一个涵盖(品牌、型号、年份、创建时间)的索引
,以便快速搜索最新的创建时间
,以及加入
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'
添加默认设置为0的新布尔列。我使用:
是旧的
| 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;
添加默认设置为0的新布尔列。我使用:
是旧的
| 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;
不,那不行。即使在我更正了您通过切换group by和order BYMODIFED输入的sql之后。请试一试。您可以尝试subquery.Neat。效果很好。非常感谢,甚至MySQL都没有提供任何保证来保证这一点。如果按
year
分组,但选择其他列而不使用聚合,则返回的值是不确定的。由于内部查询的顺序,它通常会给出预期的结果,甚至通常会给出预期的结果,但它永远不能保证给出相同的结果。对于我想要的东西,获得结果的首选方法是什么?不,这不起作用。即使在我更正了您通过切换group by和order BYMODIFED输入的sql之后。请试一试。您可以尝试subquery.Neat。效果很好。非常感谢,甚至MySQL都没有提供任何保证来保证这一点。如果按year
分组,但选择其他列而不使用聚合,则返回的值是不确定的。由于内部查询的顺序,它可能经常给出预期的结果,甚至通常也可能给出预期的结果,但它永远不能保证给出相同的结果。对于我想要的东西,获得结果的首选方法是什么?