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

MySQL关联查询返回重复行 如何获取唯一分类及对应促销信息

MySQL分类去重关联促销字段解决方案

你当前使用的隐式内连接写法,会在一个分类对应多个产品时返回多条重复分类记录,可根据你对promo字段的实际业务需求,选择对应调整方案:

  • 需求:判断分类下是否存在促销产品,仅返回是否有促销的标识
    推荐使用EXISTS子查询实现,性能更高且兼容性更好,无需处理分组模式限制:
    SELECT p.*, IF(EXISTS(SELECT 1 FROM services s WHERE s.categoryID = p.id AND s.promo = 1), 1, 0) AS has_promo
    FROM prenotable_services p
    
    也可以使用分组聚合写法(如果promo为布尔值,MAX(s.promo)会自动返回是否存在促销的结果):
    SELECT p.*, MAX(s.promo) AS has_promo
    FROM prenotable_services p
    LEFT JOIN services s ON p.id = s.categoryID
    GROUP BY p.id
    
    注意:如果你的MySQL开启了ONLY_FULL_GROUP_BY模式,需要把p表所有查询字段都加入GROUP BY列表,或者用ANY_VALUE()包裹非分组的p表字段。
  • 需求:获取分类下所有产品的促销信息汇总
    使用GROUP_CONCAT拼接所有促销字段内容,可加DISTINCT去重:
    SELECT p.*, GROUP_CONCAT(DISTINCT s.promo SEPARATOR '、') AS all_promo_info
    FROM prenotable_services p
    LEFT JOIN services s ON p.id = s.categoryID
    GROUP BY p.id
    
  • 需求:获取分类下最新/指定优先级产品的促销字段
    先通过子查询筛选出每个分类对应的目标产品,再关联分类表:
    -- 示例为取每个分类下id最大的最新产品的promo字段,可根据业务调整筛选逻辑
    SELECT p.*, s.promo
    FROM prenotable_services p
    LEFT JOIN (
        SELECT categoryID, promo 
        FROM services s1
        WHERE id = (SELECT MAX(id) FROM services s2 WHERE s2.categoryID = s1.categoryID)
    ) s ON p.id = s.categoryID
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:39:04