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

基于三张表的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_IdItem_NamePriceCategory_NameClient_Discount
1Item150.00Cat110
2Item225.20Cat20

如果需要查询其他客户的折扣,只需要把d.Client_Id = 1中的1换成对应的客户ID即可。

内容的提问来源于stack exchange,提问作者M.Mihaylov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:58:13