MySQL如何查询3个MTM关联表以获取正确的产品-规格-价格组合
问题描述
我正在网站上搭建产品菜单,其中产品可对应不同规格与价格。我已将表设计为符合3FN规范:一张产品名称表、一张产品规格表、一张产品价格表。这么拆分的原因是每个产品会有不同的规格和定价,但部分不同规格的产品售价可能一致。为了关联这些表,我创建了3张多对多关联表:产品与规格关联表、产品与价格关联表、价格与规格关联表。现在我需要一次性查询所有表,正确拉取每一组产品-规格-价格组合,之后传入PHP页面作为菜单的一部分展示。目前我已经实现了两张表的关联查询,但是需要关联3张表的信息,现有代码如下:
- 名称-规格关联查询代码:
SELECT P.product_name, S.product_size FROM ebdb.Products AS P INNER JOIN ebdb.Prod_Size_Combo AS PS ON P.product_id = PS.product_id INNER JOIN ebdb.Product_Sizes AS S ON PS.size_id = S.size_id ORDER BY P.product_id ASC, S.size_id ASC
- 名称-价格关联查询代码:
SELECT P.product_name, I.product_price FROM ebdb.Product_Prices AS I INNER JOIN ebdb.Prod_Price_Combo AS PP ON I.price_id = PP.price_id INNER JOIN ebdb.Products AS P ON P.product_id = PP.product_id ORDER BY P.product_id ASC, I.price_id ASC
- 价格-规格关联查询代码:
SELECT I.product_price, S.product_size FROM ebdb.Product_Sizes AS S INNER JOIN ebdb.Price_Size_Combo AS SI ON S.size_id = SI.size_id INNER JOIN ebdb.Product_Prices AS I ON I.price_id = SI.price_id ORDER BY S.size_id ASC, I.price_id ASC
请问我需要编写怎样的查询语句才能正确获取产品名称、产品规格、产品价格三列信息?最终查询结果总共有12条记录。
解决方案
最终查询语句
SELECT P.product_name, S.product_size, I.product_price FROM ebdb.Products AS P -- 关联产品与规格的对应关系 INNER JOIN ebdb.Prod_Size_Combo AS PS ON P.product_id = PS.product_id INNER JOIN ebdb.Product_Sizes AS S ON PS.size_id = S.size_id -- 关联规格与价格的对应关系 INNER JOIN ebdb.Price_Size_Combo AS SI ON S.size_id = SI.size_id INNER JOIN ebdb.Product_Prices AS I ON SI.price_id = I.price_id -- 校验产品与价格的对应关系,避免无效组合 INNER JOIN ebdb.Prod_Price_Combo AS PP ON P.product_id = PP.product_id AND I.price_id = PP.price_id ORDER BY P.product_id ASC, S.size_id ASC, I.price_id ASC
补充说明
- 三个关联关系全部命中才会返回数据,确保拿到的都是合法的产品-规格-价格组合,不会出现冗余的错误匹配
- 如果你的中间表存在重复关联记录,可在
SELECT后添加DISTINCT关键字去重,不影响结果字段 - 排序规则可根据前端菜单展示的实际需求调整,比如优先按价格排序等
内容的提问来源于stack exchange,提问作者ILikeLions
相关产品推荐
相关产品推荐

