基于三张表的MySQL查询需求:获取指定客户的商品对应折扣
解决方案:左连接实现商品与客户专属折扣查询
要实现“获取所有商品及其对应客户的专属折扣,无折扣商品也需返回”的需求,咱们可以利用MySQL的LEFT JOIN来保留所有商品数据,同时精准关联目标客户的折扣记录。以下是具体实现:
核心SQL语句
SELECT i.Id AS Item_Id, i.Name AS Item_Name, i.Price, c.Name AS Category_Name, -- 把无折扣的NULL值转为0,也可以改成'无折扣'更直观 IFNULL(d.Discount, 0) AS Client_Discount FROM Items i -- 关联分类表(可选,不需要分类信息可直接删除这行) LEFT JOIN Category c ON i.Cat_Id = c.Id -- 关键:将客户ID条件放在ON子句中,确保无折扣商品不会被过滤 LEFT JOIN Discount d ON i.Id = d.Item_Id AND d.Client_Id = 1 ORDER BY i.Id;
代码细节说明
- LEFT JOIN的正确用法:这里必须把
d.Client_Id = 1写在ON子句里,而不是WHERE子句。如果放在WHERE中,会直接过滤掉没有该客户折扣记录的商品,不符合“返回所有商品”的需求;放在ON里则只会关联匹配的折扣记录,不影响商品本身的返回。 - 无折扣场景处理:用
IFNULL(d.Discount, 0)把无折扣的NULL值转为0,要是想显示更友好的文字,比如“无折扣”,可以替换成CASE WHEN d.Discount IS NULL THEN '无折扣' ELSE CONCAT(d.Discount, '%') END。 - 关联Category表是可选操作,如果你不需要显示商品分类信息,直接删除这部分关联逻辑即可。
测试结果(Client_Id=1)
执行后会得到如下结果:
| Item_Id | Item_Name | Price | Category_Name | Client_Discount |
|---|---|---|---|---|
| 1 | Item1 | 50.00 | Cat1 | 10 |
| 2 | Item2 | 25.20 | Cat2 | 0 |
如果需要查询其他客户的折扣,只需要把d.Client_Id = 1中的1换成对应的客户ID即可。
内容的提问来源于stack exchange,提问作者M.Mihaylov
相关产品推荐
相关产品推荐

