refactor(schema): 优化MySQL 8窗口函数去重查询
- 修改多表连接语句,使用窗口函数ROW_NUMBER()实现去重 - 对order_cash/order_voucher/order_digit表添加窗口函数子查询,取首条记录 - 对goods_voucher_batch表添加窗口函数去重,实现精确匹配关联 - 保持原有逻辑基础上提升查询性能和准确性
This commit is contained in:
parent
f6911a0cc6
commit
fd11907f26
|
|
@ -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")
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue