求解 MySQL 8.0 Left Join 的表使用 PARTITION 分区的问题

2022-10-05 22:53:10 +08:00
 coderstory
SELECT
	mhy_order.id AS id,
	mhy_order.id AS orderId,
	mhy_trademark.id AS trademarkId,
	mhy_trademark_type.id AS typeId,
	mhy_order.order_type AS type,
	mhy_trademark_type.type AS category,
	mhy_trademark.`name` AS trademark,
	mhy_trademark_type.registration_number AS registrationNumber,
	mhy_applicant.`name` AS applicantName,
	mhy_applicant.message_corp AS messageCorp,
	IFNULL( mhy_order.complete, '否' ) AS isComplete,
	mhy_applicant.custom_name AS contactUser,
	mhy_order.charge AS charge,
	mhy_order.notification_method AS noticeType,
	mhy_order.notification_time AS noticeTime,
	sys_user.username AS salesman,
	mhy_order_progress.gen_time AS messageTime,
	ROW_NUMBER() over ( PARTITION BY mhy_order_progress.order_id ORDER BY mhy_order_progress.gen_time DESC ) RowNum,
	
FROM
	`mhy_trademark_type`
	JOIN mhy_trademark ON `mhy_trademark_type`.trademark_id = mhy_trademark.id
	JOIN mhy_order ON mhy_trademark.order_id = mhy_order.id
	JOIN mhy_applicant ON mhy_order.applicant_id = mhy_applicant.id
	JOIN `sys_user` ON `sys_user`.user_id = mhy_order.create_user_id -- JOIN mhy_applicant as tp ON mhy_order.transferor_id = tp.id
	LEFT JOIN mhy_order_progress ON mhy_order_progress.order_id = mhy_order.id

目前的 SQL 就是这样 还是比较简单的,关键在于待分组的表 mhy_order_progress 是 left join 的,可能关联不到这张表。 导致 ```PARTITION BY mhy_order_progress.order_id`` 执行时,数据都跑一个分区里了,因为 mhy_order_progress.order_id 都是 null 。

数据库是 mysql8.0 最新版本。这个 SQL 还有个非常长的 where 以及分页。

1328 次点击
所在节点    MySQL
5 条回复
liprais
2022-10-06 01:27:52 +08:00
partition by mhy_order.id
看你到底要啥,是有 progress 的取最新的订单还是要干啥
xuanbg
2022-10-06 09:00:18 +08:00
你这个是要按订单的处理时间倒序排,那可不就是没处理的都在一块吗?虽然都在一块,但第二排序就不能安订单 id 排吗?
coderstory
2022-10-06 12:32:14 +08:00
@liprais

假设有主表 tableA 和子表 tableB
A 和 B 是一对多的关系

如果是简单关联查询 则查询出来的数量和 tableB 的数量是一致的对不对?

现在我想对查询结果做分组 按 tableA 的 id 分组 查询出来的数组 关联 tableB 中最新的一条

现在我用 PARTITION BY 对 tableB 中的外键分组 然后 查询 ROW_NUMBER 最后对查询结果 筛选 只要 ROW_NUMBER = 1 的行

这样就实现了分组后 取每组最后一条 ..


参考原型

--根据 x 分组后、根据 y,z 排序后取第一条
select * from (
select ROW_NUMBER() over(partition by x order by y,z desc) RowNum ,testTable.*
from testTable) as t1 where RowNum = 1


现在的问题是子表数据可能关联补上 tableA 中关联不到 tableB 的数据 都 弄到一个分区了。这样逻辑就不对了
liprais
2022-10-06 12:34:10 +08:00
@coderstory 你用了 left join 之后关联不上的你准备怎么处理?
coderstory
2022-10-08 11:22:40 +08:00
@liprais 没办法 换了一个 分组字段

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/884818

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX