mysql - MySQL - 如何仅将具有最小值的行加入一次
问题描述
我试图为每个产品获得最低价值的行。在一个简单的数据库中。我将在下面概述。我研究了很多答案,不幸的是没有任何效果。
我已经尝试了一些方法,比如自连接,它工作正常,除了它返回双倍值的相同值。
SELECT
products.id,
products.name,
prices.price,
prices.price_init
FROM products
LEFT JOIN prices ON prices.product_id = products.id
JOIN(
SELECT products.id, min(prices.price) as min_price FROM products
LEFT JOIN prices ON prices.product_id = products.id
GROUP BY products.id
) as min_prices
ON
min_prices.id = products.id
AND
min_prices.min_price = prices.price
此查询工作正常,但结果加倍。
链接到 sqlfiddle: http ://sqlfiddle.com/#!9/d106d9a/1
如您所见,我需要以最低价格获取 price_init 字段。
谢谢。
解决方案
我希望每个产品只有一行——即使有多个最低价格——你可以过滤id
而不是过滤price
。
这看起来像
SELECT p.id, p.name, pr.price, pr.price_init
FROM products p LEFT JOIN
prices pr
ON pr.product_id = p.id AND
pr.id = (SELECT pr2.id
FROM prices pr2
WHERE pr2.product_id = pr.product_id
ORDER BY pr2.price
LIMIT 1
);
这是一个 SQL 小提琴。
请注意,在 MySQL 8+ 中,您将改为使用窗口函数:
SELECT p.id, p.name, pr.price, pr.price_init
FROM products p LEFT JOIN
(SELECT pr.*,
ROW_NUMBER() OVER (PARTITION BY pr.product_id ORDER BY pr.price) as seqnum
FROM prices pr
) pr
ON pr.product_id = p.id AND pr.seqnum = 1;
推荐阅读
- python - 如何从 django 中的表中检索 comment_replies
- python - 如何根据两个熊猫数据框参数的当前值控制在函数中应用哪个公式?
- java - 未找到 maven-compiler-plugin
- javascript - 使用 JavaScript 访问 localStorage 数据
- swift - MapKit,手动设置当前位置?有可能的?
- ios - dyld_shared_cache_extract_dylibs 在 Xcode 10 和 iPhone XS 上失败,但在 iPhone 7 上有效
- ios - 与地图交互时的功能
- java - 通过其 REST 服务或通过 CLI 脚本连接到 Openshift 是最佳选择吗?
- python-3.x - 用户在python上输入正确输入时如何使计数增加
- r - 在绘图中重新排列 ggplot 轴组