From afa28827b6aa5724141856852cda5177d3033075 Mon Sep 17 00:00:00 2001 From: weicw1996 Date: Mon, 12 Oct 2026 14:49:30 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E8=8D=AF=E5=88=86=E4=BA=AB):=20=E5=95=86?= =?UTF-8?q?=E5=93=81=E6=B8=85=E5=8D=95=E5=8E=BB=E9=87=8D=E6=94=B9=E7=94=A8?= =?UTF-8?q?=E4=BB=A3=E8=A1=A8=E8=A1=8C=EF=BC=8C=E4=BF=AE=E5=A4=8D=20ONLY?= =?UTF-8?q?=5FFULL=5FGROUP=5FBY=20=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 现象:小程序“药分享”页 onShow 抛 TypeError: Cannot read properties of undefined (reading 'list') 根因在本接口:/yxe/yxe-share-detail/page?groupByProduct=true 返回 code=1 且不带 data,前端取 data.list 直接抛异常,中断整个 onShow。 原因:原 SQL 为 `SELECT a.* FROM yxe_share_detail a WHERE ... GROUP BY a.goods_name`。 MySQL 开启 ONLY_FULL_GROUP_BY 时,SELECT 列表中 a.* 的非分组列既不在 GROUP BY 内也不函数依赖于分组列,直接报 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column '...a.id' which is not functionally dependent on columns in GROUP BY clause 生产库恰好关闭了该 sql_mode 才长期未暴露,本地库(MySQL 9.7)已开启。 改法:取每个 goods_name 在**筛选结果集内**的最小 id 作为代表行, 语义与原 WHERE 之后 GROUP BY 一致。内层子查询重复同一套筛选条件, 否则按 province/city 过筛后该代表行可能不在结果集中,对应商品会整个消失。 未用窗口函数,不依赖 MySQL 8.0。 验证(本地库): - groupByProduct=true code=0,5 个去重商品(修复前 code=1) - groupByProduct + city count=3,内外层条件一致生效 - groupByProduct + goodsName count=2 - 不带 groupByProduct count=12,原有行为不变 --- .../yxe/mapper/xml/YxeShareDetailMapper.xml | 77 ++++++++++++++++++- 1 file changed, 73 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gxwebsoft/yxe/mapper/xml/YxeShareDetailMapper.xml b/src/main/java/com/gxwebsoft/yxe/mapper/xml/YxeShareDetailMapper.xml index 6553c7e..88f6601 100644 --- a/src/main/java/com/gxwebsoft/yxe/mapper/xml/YxeShareDetailMapper.xml +++ b/src/main/java/com/gxwebsoft/yxe/mapper/xml/YxeShareDetailMapper.xml @@ -2,7 +2,28 @@ - + SELECT a.* FROM yxe_share_detail a @@ -50,10 +71,58 @@ AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') ) + + AND a.id IN ( + SELECT MIN(b.id) + FROM yxe_share_detail b + WHERE 1 = 1 + + AND b.id = #{param.id} + + + AND b.share_id = #{param.shareId} + + + AND b.province = #{param.province} + + + AND b.city = #{param.city} + + + AND b.goods_name LIKE CONCAT('%', #{param.goodsName}, '%') + + + AND b.spec LIKE CONCAT('%', #{param.spec}, '%') + + + AND b.num = #{param.num} + + + AND b.sort_number = #{param.sortNumber} + + + AND b.status = #{param.status} + + + AND b.deleted = #{param.deleted} + + + AND b.deleted = 0 + + + AND b.create_time >= #{param.createTimeStart} + + + AND b.create_time <= #{param.createTimeEnd} + + + AND (b.comments LIKE CONCAT('%', #{param.keywords}, '%') + ) + + GROUP BY b.goods_name + ) + - - GROUP BY a.goods_name -