SQL多表查询如何获取指定分类下不重复的关联品牌信息
问题原因
你当前语句返回重复品牌的核心原因是:一个品牌下可能存在多件cat_id = 11的产品,产品表和品牌表关联后,每件产品都会生成一条关联记录,所以同一个品牌会对应多条结果出现重复。
解决方案
提供两种常用实现方式,可根据你的数据规模选择:
方案1:追加DISTINCT直接去重(适合小数据量,改动最小)
直接在查询字段前加DISTINCT,即可对返回的品牌记录做去重处理:
SELECT DISTINCT b.id, b.name, b.media_file FROM wo_products p LEFT JOIN wo_companies b ON p.brand = b.id WHERE p.cat_id = 11 -- 若你的产品表分类字段实际为category可保留原写法 AND user_id = 1 -- 保留你原有的业务过滤条件 ORDER BY b.id ASC
注意:你原语句按
p.id DESC排序,去重后产品id已经失去聚合意义,建议调整为按品牌id/名称排序更合理。
方案2:用EXISTS子查询实现(适合大数据量,性能更优)
该方案逻辑更贴合你的需求本质:直接查询品牌表,仅筛选出「存在分类为11的关联产品」的品牌,不需要关联后再去重,执行效率更高:
SELECT id, name, media_file FROM wo_companies b WHERE EXISTS ( SELECT 1 FROM wo_products p WHERE p.brand = b.id AND p.cat_id = 11 AND p.user_id = 1 -- 保留原有业务过滤条件 ) ORDER BY id ASC
内容的提问来源于stack exchange,提问作者lzy crazy
相关产品推荐
相关产品推荐

