如何从两列中获得最小值以及相应的id?

1u4esq0p  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(539)

我的查询确实返回了两列中的最低价格(price\u base,price\u special),但没有返回与找到的最低价格相对应的正确的store\u id。
我的问题:

  1. SELECT grocery_item.id, grocery_item.category,
  2. grocery_category.name AS cat, grocery_item.name AS itemName,
  3. MIN( if( grocery_price.price_special>0,
  4. grocery_price.price_base)) AS price,
  5. grocery_price.store_id,
  6. grocery_store.name AS storeName
  7. FROM grocery_item
  8. LEFT JOIN grocery_category ON
  9. grocery_category.id=grocery_item.category
  10. LEFT JOIN grocery_price
  11. ON grocery_price.item_id = grocery_item.id
  12. LEFT JOIN grocery_store
  13. ON grocery_store.id=grocery_price.store_id
  14. WHERE grocery_price.selection='no'
  15. AND buy='yes'
  16. GROUP BY grocery_price.item_id
  17. ORDER BY store_id, grocery_item.category, grocery_item.name

返回以下内容:

  1. ID category cat itemName price store_id storeName
  2. 92 3 Bread/Bakery Arnold Bread 2.14 1 Food Lion

但杂货价格表包含以下信息:

  1. item_id price_base price_special store_id
  2. 92 4.29 2.14 9
  3. 92 3.99 0.00 1

所以我需要返回的store\u id是9(返回的storename不是food lion)
编辑:基于Uuerdo评论的工作查询(谢谢!)

  1. SELECT minP.item_id, gi.category, gc.name AS cat,
  2. gi.name as itemName, gp.store_id,
  3. gs.name AS storeName, minP.price
  4. FROM
  5. (SELECT p.item_id, MIN(IF(p.price_special >0,
  6. p.price_special,p.price_base)) AS price
  7. FROM grocery_item AS i
  8. INNER JOIN grocery_price AS p ON (i.id = p.item_id)
  9. WHERE i.buy = 'yes'
  10. GROUP BY p.item_id) AS minP
  11. INNER JOIN grocery_item AS gi ON minP.item_id = gi.id
  12. INNER JOIN grocery_category AS gc on gi.category = gc.id
  13. LEFT JOIN grocery_price AS gp
  14. ON minP.price = IF(gp.price_special > 0,
  15. gp.price_special,gp.price_base)
  16. AND gp.item_id = gi.id
  17. INNER JOIN grocery_store AS gs ON gp.store_id = gs.id
  18. GROUP BY gi.id
  19. ORDER BY gs.id, gi.category,gi.name
kse8i1jr

kse8i1jr1#

为未分组、未聚合字段返回的值是(有效地)从分组字段的值遇到的值中随机选择的。大多数rdbms甚至不认为这样的查询有效,甚至更新版本的mysql也默认不允许这样的查询。
在像您这样的情况下,需要与聚合结果相关联的非分组值(在这种情况下为min);聚合查询必须转换为子查询,子查询可以联接回聚合表,以查找与聚合值对应的源行。
编辑:基本上,你需要稍微不同地看待问题。您当前正在查找某个商品和该商品所列商店的最低价格;您需要找到商品的最低价格,并使用该价格找到以该价格销售该商品的商店。
这将为标记为“购买”的商品提供最低价格:

  1. SELECT p.item_id, MIN(IF(p.price_special > 0,p.price_special,p.price_base)) AS price
  2. FROM grocery_item AS i
  3. INNER JOIN grocery_price AS p ON (i.id = p.item_id)
  4. WHERE i.buy = 'yes'
  5. GROUP BY p.item_id

然后你就可以得到剩下的结果:

  1. SELECT minP.item_id
  2. , gi.name
  3. , gi.category, gc.category_name AS cat, gi.Name as itemName, gi.buy
  4. , gp.store_id, gp.name AS storeName
  5. , minP.price
  6. FROM ([the query above]) AS minP
  7. INNER JOIN grocery_item AS gi ON minP.item_id = gi.id
  8. INNER JOIN grocery_category AS gc on gi.category = gc.grocery_category_id
  9. /* Guessing on this join since grocery_category_id
  10. was not qualified with it's table name */
  11. INNER JOIN grocery_price AS gp
  12. ON minP.price = IF(gp.price_special > 0,gp.price_special,gp.price_base)
  13. /* Alternatively: ON minP.price IN (gp.price_special, gp.price_base)
  14. ... though this could cause false positives if the minP.price is 0
  15. from one store's base price being "free"
  16. */
  17. INNER JOIN grocery_store AS gs ON gp.store_id = gs.id
  18. ;
展开查看全部

相关问题