You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 20:15:01