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")