refactor(schema): 优化MySQL 8窗口函数去重查询

- 修改多表连接语句,使用窗口函数ROW_NUMBER()实现去重
- 对order_cash/order_voucher/order_digit表添加窗口函数子查询,取首条记录
- 对goods_voucher_batch表添加窗口函数去重,实现精确匹配关联
- 保持原有逻辑基础上提升查询性能和准确性
This commit is contained in:
zhouyonggao 2025-12-18 12:55:02 +08:00
parent f6911a0cc6
commit fd11907f26
2 changed files with 9 additions and 5 deletions

View File

@ -52,16 +52,20 @@ func (s ymtSchema) MapField(t, f string) (string, bool) {
func (s ymtSchema) BuildJoins(need map[string]bool, main string) []string { func (s ymtSchema) BuildJoins(need map[string]bool, main string) []string {
out := []string{} out := []string{}
if need["order_cash"] { 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"] { 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"] { 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"] { 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"] { 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") out = append(out, " LEFT JOIN `goods_voucher_subject_config` ON `goods_voucher_subject_config`.id = `goods_voucher_batch`.voucher_subject_id")