如何通过SQL筛选出所有商品重量均不超过50的订单?
解决筛选无超重商品订单的SQL问题
嘿,我来帮你搞定这个需求!你要找的是所有商品重量都不超过50的订单,本质上就是排除那些存在至少一件商品重量>50的订单。这里有两种常用的高效解法:
方法1:使用NOT EXISTS子查询
这种方法逻辑非常直观,直接检查每个订单是否不存在超重的关联商品:
SELECT DISTINCT a.order_id FROM orders a WHERE NOT EXISTS ( SELECT 1 FROM items b WHERE a.item_id = b.item_id AND b.item_weight > 50 );
如果需要同时展示订单下的商品明细,可以把上面的查询作为子查询过滤原结果:
SELECT a.order_id, b.item_name, b.item_weight FROM orders a JOIN items b ON a.item_id = b.item_id WHERE a.order_id IN ( SELECT DISTINCT order_id FROM orders o WHERE NOT EXISTS ( SELECT 1 FROM items i WHERE o.item_id = i.item_id AND i.item_weight > 50 ) );
方法2:使用GROUP BY + HAVING子句
这种方法更简洁,通过分组订单ID,筛选出该订单下所有商品的最大重量≤50的订单:
-- 先获取符合条件的订单ID SELECT order_id FROM orders a JOIN items b ON a.item_id = b.item_id GROUP BY order_id HAVING MAX(b.item_weight) <= 50; -- 如果需要展示商品明细,同样可以关联原表 SELECT a.order_id, b.item_name, b.item_weight FROM orders a JOIN items b ON a.item_id = b.item_id WHERE a.order_id IN ( SELECT order_id FROM orders o JOIN items i ON o.item_id = i.item_id GROUP BY order_id HAVING MAX(i.item_weight) <= 50 );
针对你的示例数据
两种方法都会筛选出order_id=2的订单,因为它的所有商品重量都≤50;而order_id=1因为有一件商品重量为60,会被排除在外。
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

