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

如何基于Products与Colors的一对多关系查询包含指定三种颜色的产品?

筛选同时拥有指定多种颜色的产品

嘿,这个需求我做电商类项目时经常碰到,给你分享几个实用的解法,完全贴合你给出的表结构:

方法一:GROUP BY + HAVING(通用型解法)

这是处理这类“同时满足多个条件”需求最常用的方式,不管你要匹配3种还是更多颜色,调整起来都很灵活。核心逻辑是先按产品分组,再统计该产品覆盖的目标颜色数量,只有数量等于你要求的颜色总数时才保留结果。

SELECT p.id, p.title, p.description
FROM Products p
JOIN Colors c ON p.id = c.product_id
WHERE c.color_name IN ('red', 'green', 'brown')
GROUP BY p.id, p.title, p.description
HAVING COUNT(DISTINCT c.color_name) = 3;

细节提醒:

  • 加DISTINCT是为了避免同一个产品在Colors表中有重复的颜色记录(比如某产品被多次添加red颜色),导致COUNT结果偏大。如果你的数据绝对不会有重复颜色记录,也可以去掉DISTINCT。
  • 先通过WHERE过滤出目标颜色的记录,能减少后续分组的计算量,比直接分组后再判断效率更高。

方法二:多次INNER JOIN(逻辑更直白)

如果需要匹配的颜色数量不多,这种方法读起来更清晰——通过三次关联Colors表,分别匹配每种颜色,确保产品同时存在这三种颜色的记录。

SELECT p.id, p.title, p.description
FROM Products p
JOIN Colors c1 ON p.id = c1.product_id AND c1.color_name = 'red'
JOIN Colors c2 ON p.id = c2.product_id AND c2.color_name = 'green'
JOIN Colors c3 ON p.id = c3.product_id AND c3.color_name = 'brown';

适用场景:

这种方法的优点是逻辑一目了然,但如果要匹配的颜色数量很多(比如10种),写起来会非常繁琐,这时候方法一就更合适。

额外小技巧

如果你的数据里颜色名称存在大小写差异(比如'Red'、'RED'),可以在条件里统一转成小写来避免漏判:

-- 方法一的调整版本
WHERE LOWER(c.color_name) IN ('red', 'green', 'brown')
HAVING COUNT(DISTINCT LOWER(c.color_name)) = 3;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:28:23