› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
coderstory
V2EX  ›  MySQL

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

  •  
  •   coderstory ·
    coderstory · Oct 5, 2022 · 2535 views
    This topic created in 1455 days ago, the information mentioned may be changed or developed.
    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 以及分页。

    F281M6Dh8DXpD1g2
        1
    F281M6Dh8DXpD1g2  
       Oct 6, 2022 via iPhone
    partition by mhy_order.id 呗
    看你到底要啥,是有 progress 的取最新的订单还是要干啥
    xuanbg
        2
    xuanbg  
       Oct 6, 2022
    你这个是要按订单的处理时间倒序排,那可不就是没处理的都在一块吗?虽然都在一块,但第二排序就不能安订单 id 排吗?
    coderstory
        3
    coderstory  
    OP
       Oct 6, 2022
    @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 的数据 都 弄到一个分区了。这样逻辑就不对了
    F281M6Dh8DXpD1g2
        4
    F281M6Dh8DXpD1g2  
       Oct 6, 2022
    @coderstory 你用了 left join 之后关联不上的你准备怎么处理?
    coderstory
        5
    coderstory  
    OP
       Oct 8, 2022
    @liprais 没办法 换了一个 分组字段
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4184 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 09:35 · PVG 17:35 · LAX 02:35 · JFK 05:35
    ♥ Do have faith in what you're doing.