You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动