You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL中获取仅符合筛选条件的记录:按产品ID筛选专属套餐

解决方案:筛选仅包含指定产品的MySQL套餐查询

要实现仅返回完全匹配指定产品、没有其他额外产品的套餐,我们可以通过两种常见的思路来写查询语句,下面详细说明:

方法1:使用分组+HAVING子句(适配单/多产品场景)

这种方法通过分组统计套餐内的产品数量,并确保所有产品都属于指定列表。

场景1:仅筛选包含单个产品(比如产品ID=5)的套餐

SELECT p.package_id, p.package_name
FROM Packages p
JOIN package_product pp ON p.package_id = pp.package_id
GROUP BY p.package_id, p.package_name
HAVING COUNT(DISTINCT pp.product_id) = 1  -- 套餐内仅1个产品
   AND SUM(CASE WHEN pp.product_id != 5 THEN 1 ELSE 0 END) = 0;  -- 没有非5的产品

场景2:筛选仅包含多个产品(比如产品ID=5和6)的套餐

SELECT p.package_id, p.package_name
FROM Packages p
JOIN package_product pp ON p.package_id = pp.package_id
GROUP BY p.package_id, p.package_name
HAVING COUNT(DISTINCT pp.product_id) = 2  -- 套餐内正好2个产品
   AND SUM(CASE WHEN pp.product_id NOT IN (5,6) THEN 1 ELSE 0 END) = 0;  -- 没有不在指定列表的产品

逻辑说明:

  • 先关联Packages和package_product表,获取套餐与产品的关联关系
  • 按套餐分组后,通过HAVING子句做两个校验:
    1. 套餐内的产品数量正好等于你指定的产品数量(避免多产品套餐混入)
    2. 套餐内不存在任何不在指定列表中的产品

方法2:使用NOT EXISTS(逻辑更直观)

这种写法通过“存在指定产品”且“不存在其他产品”的逻辑来筛选,适合理解和维护。

场景1:仅包含单个产品(ID=5)的套餐

SELECT p.package_id, p.package_name
FROM Packages p
-- 确保套餐包含产品5
WHERE EXISTS (
    SELECT 1 FROM package_product pp 
    WHERE pp.package_id = p.package_id AND pp.product_id = 5
)
-- 确保套餐没有其他产品
AND NOT EXISTS (
    SELECT 1 FROM package_product pp 
    WHERE pp.package_id = p.package_id AND pp.product_id != 5
);

场景2:仅包含多个产品(ID=5和6)的套餐

SELECT p.package_id, p.package_name
FROM Packages p
-- 确保套餐包含所有指定产品
WHERE EXISTS (
    SELECT 1 FROM package_product pp 
    WHERE pp.package_id = p.package_id AND pp.product_id = 5
)
AND EXISTS (
    SELECT 1 FROM package_product pp 
    WHERE pp.package_id = p.package_id AND pp.product_id = 6
)
-- 确保套餐没有其他产品
AND NOT EXISTS (
    SELECT 1 FROM package_product pp 
    WHERE pp.package_id = p.package_id AND pp.product_id NOT IN (5,6)
);

补充说明:如果你的package_product表中存在同一套餐重复关联同一产品的情况(比如同一套餐多次添加同一产品),建议在方法1中保留DISTINCT,或者在方法2中结合COUNT来确保产品数量匹配。


示例验证

假设你的表数据如下:

Packages表

package_idpackage_name
1基础套餐
2组合套餐
3扩展套餐

package_product表

package_idproduct_id
15
25
26
35
37

当你查询仅包含产品5的套餐时,两种方法都会返回:

package_idpackage_name
1基础套餐

而不会返回包含5但还有其他产品的组合套餐和扩展套餐,完全符合你的需求。

内容的提问来源于stack exchange,提问作者mazam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:25:19