V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
djs19920210
V2EX  ›  程序员

关于 left join 后结果集顺序问题

  •  
  •   djs19920210 · 2021-12-08 18:43:20 +08:00 · 1602 次点击
    这是一个创建于 1075 天前的主题,其中的信息可能已经有所发展或是发生改变。
    a 表:
    https://imgur.com/B7ssei4

    b 表:
    https://imgur.com/B7ssei4

    查询语句:
    SELECT a.id AS aid ,a.`name`,b.`id` AS bid ,b.`name` FROM a LEFT JOIN b ON a.`bid`=b.`id`;

    结果:
    https://imgur.com/0QnBSoR


    问题:
    left join 不应该是以左表为基准跟右表进行笛卡尔积吗,怎么发现结果集的顺序是反过来的。a 表 left join b 表居然会按 b 表的顺序排序出结果
    10 条回复    2021-12-09 13:08:50 +08:00
    liprais
        1
    liprais  
       2021-12-08 18:44:36 +08:00 via iPhone
    sql 的结果集是无序的,除非你用 order by
    djs19920210
        2
    djs19920210  
    OP
       2021-12-08 18:48:55 +08:00
    djs19920210
        3
    djs19920210  
    OP
       2021-12-08 18:49:25 +08:00
    b 表
    djs19920210
        4
    djs19920210  
    OP
       2021-12-08 18:49:47 +08:00
    查询结果
    zakokun
        5
    zakokun  
       2021-12-08 18:51:14 +08:00
    你 ab 表的图片是一样的;
    具体结果这个你可以 explain 一下,看看用到的索引。因为你的 bid 是 b 表的主键 id ,所以有可能是用 b 的主键索引,因此顺序是按照 b 表的
    Ariver
        6
    Ariver  
       2021-12-08 18:53:39 +08:00 via iPhone
    没有 order by 的时候的顺序是不稳定的。不要依赖这个写逻辑。
    Cihua
        8
    Cihua  
       2021-12-09 09:46:22 +08:00
    STRAIGHT_JOIN ?
    orzwalker111
        9
    orzwalker111  
       2021-12-09 13:03:32 +08:00 via iPhone
    1 left 不能决定会用左表作为驱动表,驱动表是小表,在决定哪个表做驱动表的时候,应该是两个表按照各自的条件过滤,过滤完成之后,计算参与 join 的各个字段的总数据量,数据量小的那个表,就是“小表”,应该作为驱动表
    2 如果有 left 语义,应该将被驱动表字段放在 on ,不要放在 where
    orzwalker111
        10
    orzwalker111  
       2021-12-09 13:08:50 +08:00 via iPhone
    sql 中涉及查询时 a 三个字段,b 两个,b 小表,作为驱动表
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5941 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 03:25 · PVG 11:25 · LAX 19:25 · JFK 22:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.