MySQL如何基于部分字段的唯一组合查询表中全部列
你需要的是对name和variety组合去重,同时保留每个分组下的完整行数据,从你给出的预期结果来看,是保留每个组合下id最小的行,以下是两种常用实现方案:
方案1:MySQL 8.0+ 窗口函数实现
WITH ranked_products AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY name, variety ORDER BY id ASC) AS rn FROM Products ) SELECT id, name, variety, t_min, t_max, entity FROM ranked_products WHERE rn = 1;
这里用PARTITION BY name, variety对两个字段的组合分组,ORDER BY id ASC保证每个分组内id最小的行排名为1,过滤rn=1的行即可得到预期结果。
方案2:MySQL 5.x 兼容实现
SELECT p.* FROM Products p INNER JOIN ( SELECT MIN(id) AS min_id FROM Products GROUP BY name, variety ) t ON p.id = t.min_id;
先通过子查询拿到每个name+variety组合对应的最小id,再关联原表拿到对应id的全列数据,效果和窗口函数方案完全一致。
内容的提问来源于stack exchange,提问作者Álex
相关产品推荐
相关产品推荐

