我正在寻找的是只能返回按产品ID过滤的选定包的查询。
即使我只选择一个产品,查询也应只返回在where子句中定义的记录,如果指定的产品ID也包含在其他包中,则不应返回记录。
表格示例
套餐表
id package_name
------ ------------
2 STANDARD
3 BUSINESS
5 BASIC
6 CLASSIC
package_product表
id package_id product_id
------ ---------- ------------
2 3 52
3 230 52
4 230 53
5 2 52
6 2 53
7 5 52
8 5 53
产品表
id product_name
------ ----------------------
52 Logo Design
53 Website Design
54 Business Card Design
查询我正在尝试使用
SELECT p.id, p.package_name, p.package_price, pp.product_id
FROM package_product pp INNER JOIN packages p ON p.id = pp.package_id
WHERE pp.product IN (52, 53)
结果我得到了什么
id package_name package_price product_id
------ ------------ ------------- ------------
3 BUSINESS 139 52
230 ULTIMATE 1149 52
230 ULTIMATE 1149 53
2 STANDARD 89 52
2 STANDARD 89 53
5 BASIC 265 52
5 BASIC 265 53
我在寻找什么
id package_name package_price product_id
------ ------------ ------------- ------------
230 ULTIMATE 1149 52
230 ULTIMATE 1149 53
2 STANDARD 89 52
2 STANDARD 89 53
5 BASIC 265 52
5 BASIC 265 53
答案 0 :(得分:0)
您可以加入子查询,该子查询强制限制匹配包具有52和53个产品:
SELECT
p.id,
p.package_name,
p.package_price,
pp.product_id
FROM package_product pp
INNER JOIN
(
SELECT package_id
FROM package_product
WHERE product_id IN (52, 53)
GROUP BY package_id
HAVING COUNT(DISTINCT product_id) = 2
) t
ON pp.package_id = t.package_id
INNER JOIN packages p
ON p.id = pp.package_id;
上面的t
别名的子查询找到包含52和53产品的那些包。用作内部联接,它会过滤掉不匹配的包。