From fd11907f26169d1e806fcfef2938a69fb569e99a Mon Sep 17 00:00:00 2001 From: zhouyonggao <1971162852@qq.com> Date: Thu, 18 Dec 2025 12:55:02 +0800 Subject: [PATCH] =?UTF-8?q?refactor(schema):=20=E4=BC=98=E5=8C=96MySQL=208?= =?UTF-8?q?=E7=AA=97=E5=8F=A3=E5=87=BD=E6=95=B0=E5=8E=BB=E9=87=8D=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改多表连接语句,使用窗口函数ROW_NUMBER()实现去重 - 对order_cash/order_voucher/order_digit表添加窗口函数子查询,取首条记录 - 对goods_voucher_batch表添加窗口函数去重,实现精确匹配关联 - 保持原有逻辑基础上提升查询性能和准确性 --- server/internal/exporter/stream.go | 2 +- server/internal/schema/ymt.go | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/server/internal/exporter/stream.go b/server/internal/exporter/stream.go index c837666..3d3fbb1 100644 --- a/server/internal/exporter/stream.go +++ b/server/internal/exporter/stream.go @@ -158,7 +158,7 @@ func CountRowsFast(db *sql.DB, ds, main string, filters map[string]interface{}) } // 记录行数统计 SQL,方便排查估算问题 logging.JSON("INFO", map[string]interface{}{ - "event": "count_fast_query", + "event": "count_fast_query", "datasource": ds, "main": main, "sql": q, diff --git a/server/internal/schema/ymt.go b/server/internal/schema/ymt.go index 07687e2..869a1aa 100644 --- a/server/internal/schema/ymt.go +++ b/server/internal/schema/ymt.go @@ -52,16 +52,20 @@ func (s ymtSchema) MapField(t, f string) (string, bool) { func (s ymtSchema) BuildJoins(need map[string]bool, main string) []string { out := []string{} if need["order_cash"] { - out = append(out, " LEFT JOIN `order_cash` ON `order_cash`.order_no = `order_info`.order_no") + // MySQL 8 窗口函数去重,取每个订单的第一条记录 + out = append(out, " LEFT JOIN (SELECT *, ROW_NUMBER() OVER (PARTITION BY order_no ORDER BY id) AS rn FROM `order_cash`) AS `order_cash` ON `order_cash`.order_no = `order_info`.order_no AND `order_cash`.rn = 1") } if need["order_voucher"] { - out = append(out, " LEFT JOIN `order_voucher` ON `order_voucher`.order_no = `order_info`.order_no") + // MySQL 8 窗口函数去重,取每个订单的第一条记录 + out = append(out, " LEFT JOIN (SELECT *, ROW_NUMBER() OVER (PARTITION BY order_no ORDER BY id) AS rn FROM `order_voucher`) AS `order_voucher` ON `order_voucher`.order_no = `order_info`.order_no AND `order_voucher`.rn = 1") } if need["order_digit"] { - out = append(out, " LEFT JOIN `order_digit` ON `order_digit`.order_no = `order_info`.order_no") + // MySQL 8 窗口函数去重,取每个订单的第一条记录 + out = append(out, " LEFT JOIN (SELECT *, ROW_NUMBER() OVER (PARTITION BY order_no ORDER BY id) AS rn FROM `order_digit`) AS `order_digit` ON `order_digit`.order_no = `order_info`.order_no AND `order_digit`.rn = 1") } if need["goods_voucher_batch"] { - out = append(out, " LEFT JOIN `goods_voucher_batch` ON `goods_voucher_batch`.channel_batch_no = `order_voucher`.channel_batch_no") + // MySQL 8 窗口函数去重 + out = append(out, " LEFT JOIN (SELECT *, ROW_NUMBER() OVER (PARTITION BY channel_batch_no ORDER BY id) AS rn FROM `goods_voucher_batch`) AS `goods_voucher_batch` ON `goods_voucher_batch`.channel_batch_no = `order_voucher`.channel_batch_no AND `goods_voucher_batch`.rn = 1") } if need["goods_voucher_subject_config"] { out = append(out, " LEFT JOIN `goods_voucher_subject_config` ON `goods_voucher_subject_config`.id = `goods_voucher_batch`.voucher_subject_id")