mysql - 仅选择最近的日期

标签 mysql sql select max

我遇到了一个绝对让我难过的查询。我有一个链式餐厅的 mysql 数据库,它每年跟踪菜单项的价格。在这个特定的查询中,我试图只获取每家商店的商品的最新价格。

ItemMenu
pk  storeNum itemNum vendorNum  size    price   year
1   5555     2000    3150       Large   3.99    2015
2   5555     2000    3150       Large   3.75    2014
3   3333     2000    3153       Large   3.69    2014
4   2222     2000    3150       Large   3.89    2014
5   2222     2000    3150       Large   3.69    2013


  ItemList
itemNum item            categoryNum
2000    Mashed Potatoes 2000
2001    Green Beans     2000
2002    Coleslaw        2000
2003    Baked Beans     2000
2004    Corn            2000

ItemCategory    
categoryNum type
2000        Side
2001        Dessert
2002        Drink
2003        Sauce

ItemVendor  
vendorNum   vendorName
3150        Acme Foods
3152        John's Vegetables
3153        Smith's Wholesale

Stores          
storeNum    franchisee    address        phone
5555        David Smith   9999 Main st   555-1212 
3333        James Bond    123 Baker      867-5309
2222        Mark Jones    450 21st Ave   888-5411

我想要返回的是

storeNum, franchisee, item, type, vendorName, size, price, year 但仅限于最近一年。

5555, David Smith, Mashed Potatoes, Side, Acme Foods, Large, 3.99, 2015
3333, James Bond,  Mashed Potatoes, Side, Smith's Wholesale, 3.69, 2014
2222, Mark Jones,  Mashed Potatoes, Side, Acme Foods, Large, 3.89, 2014

我希望这是有道理的,我完全不知道如何连接多个表并且只提取最近一年的数据。

谢谢,

凯文

我有这个工作,但遇到了另一个问题,由于年中价格上涨,我可能在给定年份有多个价格。在我选择了最高年份后,如何添加一个额外的子查询来获取最高价格?

我当前的查询

SELECT m.storeNum, m.itemNum,size,m.price,year FROM ItemMenu m,    
(SELECT storeNum, itemNum, MAX(year) maxYear FROM ItemMenu
GROUP BY storeNum, itemNum) yt, (SELECT storeNum, itemNum, MAX(price)        
maxPrice FROM ItemMenu) mp 
WHERE m.storeNum=yt.storeNum AND m.itemNum=yt.itemNum 
AND m.year=yt.maxYear AND m.itemNum=5000 AND m.storeNum=205706;

返回最长年份的有效结果(我选择了特定的商店和商品以减少结果数量)。

+----------+---------+------------+-------+------+
| storeNum | itemNum | size       | price | year |
+----------+---------+------------+-------+------+
|   205706 |    5000 | Individual |  1.59 | 2014 |
|   205706 |    5000 | Large      |  3.69 | 2014 |
|   205706 |    5000 | Large      |  3.59 | 2014 |
|   205706 |    5000 | Individual |  1.79 | 2014 |
+----------+---------+------------+-------+------+

我需要进一步减少它,所以我只得到 1.79 美元和 3.69 美元的值。

谢谢

-凯文

最佳答案

您需要使用子查询:首先获取给定 (item,store) 配对的最近一年的一组数据。接下来,选择该 (item,store,year) 三元组的价格:

SELECT m.storeNum, m.itemNum,price,year FROM ItemMenu m,
    (SELECT storeNum, itemNum, MAX(year) maxYear FROM ItemMenu 
        GROUP BY storeNum, itemNum) yt
    WHERE m.storeNum=yt.storeNum AND m.itemNum=yt.itemNum 
          AND m.year=yt.maxYear;

当然,您可以将各种 ID->name 表连接到此以获得人类可读的数据,但我怀疑您的问题是弄清楚如何获取最新价格。

还应该注意的是,这可以通过 JOIN 来完成,而不是在 FROM 部分中包含子查询;这可能会更快。

关于mysql - 仅选择最近的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29017843/

相关文章:

php - 注意:未定义索引:已记录

c# - 在 CosmosDB 文档的字典中查询项目

MySQL - INSERT INTO SELECT ( INSERT INTO ...) - 嵌套插入

c++ - fork 和执行后如何使用带选择的管道?

mysql - 从一个选择查询插入多个表的查询

MySQL 在一条语句中选择和更新

MySQL查找多个子集的模式

mysql - 我应该将财务日志相关信息存储在不同的数据库上吗?

php - 如何使用php删除目录中的图像文件同时添加新图像文件?

sql - 具有不同数据的数据库对象