选择仅最近的日期

时间:2015-03-12 18:45:17

标签: 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,特许经营商,商品,类型,供应商名称,尺寸,价格,年份 但仅限于最近一年。

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美元的价值。

由于

-Kevin

1 个答案:

答案 0 :(得分:0)

您需要使用子查询:第一次获得给定(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->名称表加入到此处以获取人类可读的数据,但我怀疑您的问题是如何获取最新价格。

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