多表查询求助:如何筛选fk_category_id=2的关联品牌?
问题解析与解决方案
原SQL的问题点
- 返回列不符合预期:原语句SELECT了
m.name, m.id, p.fk_category_id三个字段,而预期结果只需要品牌的id和name,多余的p.fk_category_id导致结果列不匹配。 - 未处理重复记录:如果同一品牌关联多个符合条件的产品,原语句会返回多条相同的品牌记录,不符合“获取所有关联品牌”的去重需求。
- 连接条件写法不规范:将表关联条件
p.fk_marque_id = m.id放在WHERE子句中,虽然部分数据库允许运行,但不符合SQL标准写法,降低了代码可读性和维护性。
修正后的SQL语句
方案1:使用DISTINCT去重
SELECT DISTINCT m.id, m.name FROM produits p INNER JOIN manufacturers m ON p.fk_marque_id = m.id WHERE p.fk_category_id = 2 AND p.is_active = 1 AND p.is_delete = 0;
方案2:使用GROUP BY去重
SELECT m.id, m.name FROM produits p INNER JOIN manufacturers m ON p.fk_marque_id = m.id WHERE p.fk_category_id = 2 AND p.is_active = 1 AND p.is_delete = 0 GROUP BY m.id, m.name;
修正说明
- 指定连接条件:用
ON子句明确produits表的fk_marque_id与manufacturers表的id的关联关系,逻辑更清晰,符合SQL编码规范。 - 精简返回字段:仅选择
m.id和m.name,与预期结果的列完全匹配。 - 去重处理:通过
DISTINCT或GROUP BY确保每个品牌仅返回一条记录,避免重复数据。
内容的提问来源于stack exchange,提问作者Nicolas
相关产品推荐
相关产品推荐

