MySQL查询时排除restaurant_name重复行 解决1055错误及查询慢问题
绝对不建议直接禁用sql_mode=only_full_group_by配置
该配置是MySQL用来规范GROUP BY语义的强制校验规则,符合SQL标准要求。禁用后MySQL会随机返回非分组列的取值,查询结果不具备确定性,生产环境严禁使用该操作。
你之前的写法除了结果不稳定之外,性能差的核心原因是:GROUP BY操作需要扫描全表所有列做聚合运算,当表字段多、数据量大的时候,IO开销会非常高。
方案1:MySQL 8.0及以上版本(最优选择)
使用窗口函数ROW_NUMBER()实现,逻辑清晰性能稳定:
WITH ranked_restaurant AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY restaurant_name ORDER BY restaurant_id ASC) AS group_rank FROM restaurant_data ) SELECT restaurant_id, restaurant_name, city, 此处替换为其余5个列的名称 FROM ranked_restaurant WHERE group_rank = 1;
逻辑说明:按restaurant_name分组,组内按restaurant_id升序排序,取每个分组的第一条数据,完全匹配你期望的输出结果。
方案2:MySQL 5.x版本(兼容旧版本)
用子查询先筛选出每个餐厅名称对应的最小id,再关联原表取全量字段,符合only_full_group_by规范不会报错:
SELECT t1.* FROM restaurant_data t1 INNER JOIN ( SELECT MIN(restaurant_id) AS min_rest_id FROM restaurant_data GROUP BY restaurant_name ) t2 ON t1.restaurant_id = t2.min_rest_id;
性能优化建议
给restaurant_name和restaurant_id建立联合索引,两种方案的查询效率都会提升数倍,无需修改SQL逻辑。
内容的提问来源于stack exchange,提问作者RobinYoHood
相关产品推荐
相关产品推荐

