【问题标题】:MySQL SELECT-query: How can I get the right ID when using the MIN()-function in my query?MySQL SELECT-query:在查询中使用 MIN()-function 时如何获得正确的 ID?
【发布时间】:2019-11-05 01:37:24
【问题描述】:

我正在 Visual Studio 中编写一个 C# Windows 窗体应用程序,我正在尝试从购物清单中获取有关超市 2 和超市 3 中产品最低价格的数据。

我需要采取的第一步是进行正确的 SELECT 查询,从我的本地 MySQL 数据库返回此数据。

我的价格表中有以下列:

  • 价格
  • 条码
  • supermarket_id

我还有一张超市桌子,里面有 3 个超市:

  • supermarket_id = 1 NAME = 超市1
  • supermarket_id = 2 NAME = 超市2
  • supermarket_id = 3 NAME = 超市3

超市表中每个超市都有一个产品的价格

我正在使用以下查询让数据库返回我想要的数据:

SELECT pro.name, MIN(p.price) AS 'Lowest Price', p.supermarket_id
FROM (
    SELECT i.product_barcode
    FROM shopping_list_items i
    WHERE i.shopping_list_id = 95
) s
JOIN prices p ON s.product_barcode = p.barcode
JOIN products pro ON s.product_barcode = pro.barcode
GROUP BY s.product_barcode;

以上查询返回产品名称、产品最低价格和supermarket_id。但是,即使产品的价格不在超市 1 而是在超市 3,supermarket_id 始终为 1。

所以我现在的问题是我的查询必须如何才能获得超市 ID 以及特定杂货清单中产品的最低价格

【问题讨论】:

  • 啊!可爱的 MySQL 运行聚合查询,缺少 GROUP BY 列,在任何其他数据库中,这个查询都应该失败。请务必始终打开ONLY FULL GROUP BY 模式。这种模式对 SQL 初学者来说是一种伤害。

标签: mysql sql select subquery min


【解决方案1】:

为此,您应该使用subquery 使用group by and having 子句获取所有条形码及其最低价格。然后您可以使用结果进一步加入prices 表。

select p2.price as lowest_price, p2.barcode as prod_barcode , p2.supermarket_id as supermarket from
            (
              select min(price) as min_p, barcode min_b from prices p1 where p1.supermarket_id!=1 group by barcode having barcode in 
              (
                SELECT i.product_barcode FROM shopping_list_items i WHERE i.shopping_list_id = 95
              )
            ) 
    m join prices p2 where m.min_p=p2.price and m.min_b= p2.barcode;

【讨论】:

  • 我假设您提供的以下查询返回单行。选择 i.product_barcode FROM shopping_list_items i WHERE i.shopping_list_id = 95
  • 我复制了你之前的查询,修改了一下,执行了它,我得到的结果是正确的,但我只希望它计算超市 2 和超市 3 的最低价格。我现在也从超市 1 获得最小值。
  • 为此,您可以在 Supermarket_id 上添加 where 子句
  • supermarket_id 仅在 SELECT 子句中使用我尝试在 WHERE 子句中也使用它,例如 WHERE supermarket_id != 1 但是当我执行此操作时,它只是不给我向后排。
  • 我刚刚修改并检查了您更新后的查询:SELECT p2.barcode, p2.supermarket_id, p2.price AS 'lowest price' FROM ( SELECT MIN(price) AS min_p, barcode min_b FROM prices p1 GROUP BY barcode HAVING barcode IN ( SELECT i.product_barcode FROM shopping_list_items i WHERE i.shopping_list_id = 95 ) m JOIN 价格 p2 WHERE m.min_p=p2.price AND m.min_b= p2.barcode AND p2.supermarket_id in (2,3 ) 但这不会返回最便宜的价格在超市 1 的行
【解决方案2】:
SELECT p.name, pr.lowest_price, p.supermarket_id,s.supermarket_name from 
products p INNER JOIN
(SELECT barcode,supermarket_id,MIN(price) as AS 'lowest_price'
FROM prices
GROUP BY barcode,supermarket
)pr on pr.barcode = p.barcode
INNER JOIN supermarkets s on pr.supermarket_id = s.supermarket_id

【讨论】:

  • 嗨,谢谢你的回答,但是这个查询不起作用,我遇到了语法错误。
  • 您现在可以检查一下吗?显然,表的别名有些不匹配
【解决方案3】:

考虑使用正确的 GROUP BY 子句来解决 OP 需求的调整后聚合查询:

获取 Supermarket_id 以及特定杂货清单中产品的最低价格

SELECT p.supermarket_id, 
       pro.name as product_name, 
       MIN(p.price) AS 'Lowest Price'
FROM (
    SELECT i.product_barcode
    FROM shopping_list_items i
    WHERE i.shopping_list_id = 95
) s
JOIN prices p ON s.product_barcode = p.barcode
JOIN products pro ON s.product_barcode = pro.barcode
GROUP BY p.supermarket_id, 
         pro.name;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-15
    • 2020-02-03
    • 2020-04-04
    • 2017-12-24
    • 1970-01-01
    • 2016-01-24
    • 2013-03-19
    • 2012-07-29
    相关资源
    最近更新 更多