如何调整SQL查询,仅统计含同名带*与不带*商品的订单
筛选同时包含同名无后缀与带*后缀商品的订单
嘿,我来帮你调整这个SQL查询!原来的语句是通过对比商品名的总数量和去重数量来找出有重复商品名的订单,但你的场景更特殊——需要精准定位那些同时包含某商品的无后缀版本和带 *后缀版本的订单,比如要留下同时有potato和potato *的订单,排除只含其中一种的情况。
这里给你一个简洁且高效的修改方案:
SELECT order_id FROM ( SELECT od.order_id, -- 提取不带后缀的基础商品名(移除末尾的" *") CASE WHEN p.product_name LIKE '% *' THEN SUBSTRING(p.product_name, 1, LEN(p.product_name) - 2) ELSE p.product_name END AS base_product_name, -- 标记该商品是否带" *"后缀 CASE WHEN p.product_name LIKE '% *' THEN 1 ELSE 0 END AS has_suffix FROM order_details od JOIN products p ON od.product_id = p.product_id ) AS order_product_bases -- 按订单+基础商品名分组,检查是否同时存在两种后缀状态 GROUP BY order_id, base_product_name HAVING COUNT(DISTINCT has_suffix) = 2 -- 最后去重,确保每个订单只出现一次 GROUP BY order_id
逻辑拆解:
- 内层子查询:先把每个商品名处理成「基础名称」(去掉末尾的
*),同时用has_suffix标记该商品是否带后缀。比如potato *会被转换成基础名potato,标记为1;potato的基础名还是potato,标记为0。 - 第一次分组筛选:按订单ID和基础商品名分组,统计每组里的后缀类型数量。如果数量等于2,说明这个基础商品在该订单里同时存在带和不带的版本。
- 最终去重:因为一个订单可能有多个符合条件的基础商品,最后再按订单ID分组去重,得到所有符合要求的订单。
用你的测试数据验证:
- 订单9:只有
orange(无后缀),不符合; - 订单10:同时有
potato(无后缀)和potato *(带后缀),符合条件,会被筛选出来; - 订单11:只有
potato *和orange,没有potato,不符合;
所以最终查询结果只会返回order_id=10,完全符合你的需求。
内容的提问来源于stack exchange,提问作者sh4rkyy
相关产品推荐
相关产品推荐

