MySQL关联查询返回重复行 如何获取唯一分类及对应促销信息
MySQL分类去重关联促销字段解决方案
你当前使用的隐式内连接写法,会在一个分类对应多个产品时返回多条重复分类记录,可根据你对promo字段的实际业务需求,选择对应调整方案:
- 需求:判断分类下是否存在促销产品,仅返回是否有促销的标识
推荐使用EXISTS子查询实现,性能更高且兼容性更好,无需处理分组模式限制:
也可以使用分组聚合写法(如果promo为布尔值,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 pMAX(s.promo)会自动返回是否存在促销的结果):
注意:如果你的MySQL开启了SELECT p.*, MAX(s.promo) AS has_promo FROM prenotable_services p LEFT JOIN services s ON p.id = s.categoryID GROUP BY p.idONLY_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
相关产品推荐
相关产品推荐

