MySQL SELECT-查询:在我的查询中使用 MIN()-函数时如何获得正确的 ID?
MySQL SELECT-query: How can I get the right ID when using the MIN()-function in my query?
我正在 Visual Studio 中编写 C# Windows Forms 应用程序,我正在尝试从购物清单中获取有关超市 2 和超市 3 中产品最低价格的数据。
我需要采取的第一步是进行正确的 SELECT 查询,return 从我的本地 MySQL 数据库中获取此数据。
我的价格中有以下列-table:
- 价格
- 条形码
- supermarket_id
我还有一家超市-table 其中包括 3 家超市:
- supermarket_id = 1 名称 = 超市 1
- supermarket_id = 2 名称 = 超市 2
- supermarket_id = 3 NAME = supermarket3
一个商品在超市每个超市都有价格-table
我正在使用以下查询让数据库 return 我想要的数据:
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;
以上查询return商品名称,商品最低价和supermarket_id。但是supermarket_id总是1,虽然商品的价格不在supermarket1而是在supermarket3.
所以我现在的问题是我的查询必须如何才能获得 supermarket_id 以及特定杂货清单中产品的最低价格
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
为此,您应该使用 subquery
来获取所有条形码及其使用 group by and having
子句的最低价格。然后您可以使用结果进一步加入 prices
table.
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;
考虑这个调整后的聚合查询,其中包含正确的 GROUP BY
子句,它解决了 OP 的需求:
to get the supermarket_id along with the minimum price of the products in a specific grocery list
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;
我正在 Visual Studio 中编写 C# Windows Forms 应用程序,我正在尝试从购物清单中获取有关超市 2 和超市 3 中产品最低价格的数据。
我需要采取的第一步是进行正确的 SELECT 查询,return 从我的本地 MySQL 数据库中获取此数据。
我的价格中有以下列-table:
- 价格
- 条形码
- supermarket_id
我还有一家超市-table 其中包括 3 家超市:
- supermarket_id = 1 名称 = 超市 1
- supermarket_id = 2 名称 = 超市 2
- supermarket_id = 3 NAME = supermarket3
一个商品在超市每个超市都有价格-table
我正在使用以下查询让数据库 return 我想要的数据:
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;
以上查询return商品名称,商品最低价和supermarket_id。但是supermarket_id总是1,虽然商品的价格不在supermarket1而是在supermarket3.
所以我现在的问题是我的查询必须如何才能获得 supermarket_id 以及特定杂货清单中产品的最低价格
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
为此,您应该使用 subquery
来获取所有条形码及其使用 group by and having
子句的最低价格。然后您可以使用结果进一步加入 prices
table.
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;
考虑这个调整后的聚合查询,其中包含正确的 GROUP BY
子句,它解决了 OP 的需求:
to get the supermarket_id along with the minimum price of the products in a specific grocery list
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;