MySQL 5.7中DISTINCT函数失效,求PHP代码中的替代实现方案
解决MySQL 5.7下PHP查询中DISTINCT替换问题
升级到MySQL 5.7后出现这个问题,大概率是因为5.7默认开启了ONLY_FULL_GROUP_BY严格模式,它会限制那些不符合SQL标准的查询写法。你原来的查询用DISTINCT(YEAR(displayDate))去重年份,但排序时用的是displayDate——这个字段不在最终的结果集里,严格模式下就会报错。
用GROUP BY替代DISTINCT的正确写法有两种,看你需要的排序逻辑:
1. 和原查询排序逻辑完全一致(按各年份的最新日期倒序)
$myDB->contentArray = $myDB->executeAssoc(" SELECT YEAR(displayDate) as year FROM `inlineItemData_standardList` WHERE `inlineItemGroupID` = $inlineItemGroupID GROUP BY YEAR(displayDate) ORDER BY MAX(displayDate) DESC ");
这里GROUP BY YEAR(displayDate)会把同一年份的记录归为一组,得到唯一的年份值,和DISTINCT效果一致。MAX(displayDate)用来获取每个年份里的最新日期,以此排序就能和你原来用ORDER BY displayDate DESC的结果保持一致。
2. 直接按年份倒序(更简洁,适合只需要年份从新到旧的场景)
$myDB->contentArray = $myDB->executeAssoc(" SELECT YEAR(displayDate) as year FROM `inlineItemData_standardList` WHERE `inlineItemGroupID` = $inlineItemGroupID GROUP BY year ORDER BY year DESC ");
这里直接用别名year来分组和排序,逻辑更清晰,结果也是唯一的年份列表。
额外提醒:SQL注入风险
你的代码里直接把$inlineItemGroupID拼进SQL语句,这存在严重的SQL注入风险。如果你的数据库类支持预处理语句,建议改成这样(以mysqli为例):
$stmt = $myDB->prepare(" SELECT YEAR(displayDate) as year FROM `inlineItemData_standardList` WHERE `inlineItemGroupID` = ? GROUP BY year ORDER BY year DESC "); $stmt->bind_param("i", $inlineItemGroupID); // 如果ID是字符串类型,把"i"改成"s" $stmt->execute(); $myDB->contentArray = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
内容的提问来源于stack exchange,提问作者stowbee




