MySQL查询如何避免返回重复行?求替代新增字段的去重方案
解决MySQL按
seller+type组合去重的问题 你核心需求是对seller和type的组合值去重,每组仅保留一行数据,之前用GROUP BY type只按单一字段分组,所以才只返回2条记录,没命中你的实际需求。不用新增字段也能搞定,给你几种常用方法:
方法1:GROUP BY组合字段 + 聚合函数取指定行
直接按seller和type的组合分组,用聚合函数(比如MIN()/MAX())选取每组里的某一行id,再关联原表拿到完整数据:
-- 保留每组id最小的行(想保留最大id就换MAX(id)) SELECT t1.* FROM table1 t1 JOIN ( SELECT MIN(id) AS group_id FROM table1 GROUP BY seller, type ) t2 ON t1.id = t2.group_id;
如果只需要seller、type和对应的一个id,也可以简化成:
SELECT MIN(id) AS id, seller, type FROM table1 GROUP BY seller, type;
方法2:窗口函数(MySQL 8.0+推荐)
如果你的MySQL版本是8.0及以上,窗口函数ROW_NUMBER()会更灵活,能自定义每组内选哪一行(比如按id排序取第一,或按其他字段排序):
SELECT id, seller, type FROM ( SELECT *, -- 按seller+type分组,每组内按id排序,给每行标序号 ROW_NUMBER() OVER (PARTITION BY seller, type ORDER BY id) AS row_num FROM table1 ) temp WHERE row_num = 1; -- 只取每组的第一行
要是想保留每组里最新的行(假设id越大越新),把ORDER BY id改成ORDER BY id DESC就行,调整起来非常灵活。
为什么你之前的查询不对?
你之前的子查询先排序,再GROUP BY T1.type,但MySQL的GROUP BY会把相同type的行合并成一组,不管seller是否相同——比如type=AB会把seller=234和seller=345的行都合并,自然只返回2条,这和你要的seller+type组合去重完全不符。
内容的提问来源于stack exchange,提问作者user3299199
相关产品推荐
相关产品推荐

