MySQL GROUP BY查询无法获取id字段 报Undefined array key错误
问题根因
- 你编写的查询语句外层仅指定返回
symbol字段,执行后返回的结果集本身就不包含id字段,这是读取$row['id']报错的直接原因。 - 现有「子查询先排序再外层分组」的写法不符合SQL规范:MySQL默认开启
ONLY_FULL_GROUP_BY模式时,GROUP BY操作要求所有非聚合返回字段都出现在GROUP BY子句中,你这种写法即使把外层改为SELECT *也无法正常执行,且分组逻辑不会保留子查询的排序结果,也拿不到你想要的按fav倒序排序后的对应记录id。 - PHP版本差异只是错误提示的等级不同:PHP7.4下未定义数组键默认抛出Notice级别的错误,如果你未开启低级别错误显示就不会看到报错,PHP8.0+将该错误提升为Warning级别,所以会直接弹出提示,本质都是结果集不存在id字段导致的。
你后续写的SELECT * FROM tableName ORDER BY symbol DESC能正常读取id,是因为该语句直接返回了表中所有字段,没有过滤字段也没有分组逻辑,所以结果集包含id字段。
修复方案
如果你需求是取每个symbol对应的fav值最高的那条记录的id、symbol字段,可以根据你的MySQL版本选择对应写法:
MySQL 8.0及以上版本(支持窗口函数)
SELECT id, symbol FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY symbol ORDER BY fav DESC) AS rn FROM tableName ) AS t WHERE rn = 1
MySQL 5.x版本
SELECT t1.id, t1.symbol FROM tableName t1 INNER JOIN ( SELECT symbol, MAX(fav) AS max_fav FROM tableName GROUP BY symbol ) t2 ON t1.symbol = t2.symbol AND t1.fav = t2.max_fav
修改查询语句后PHP端不需要调整,就能正常读取$row['id']和$row['symbol']字段。
内容的提问来源于stack exchange,提问作者sebseb
相关产品推荐
相关产品推荐

