我遇到了一个绝对让我难过的查询。我有一个链式餐厅的 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/