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

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

  •  
  •   djs19920210 · 201 天前 · 843 次点击
    这是一个创建于 201 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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  
       201 天前 via iPhone
    sql 的结果集是无序的,除非你用 order by
    djs19920210
        2
    djs19920210  
    OP
       201 天前
    djs19920210
        3
    djs19920210  
    OP
       201 天前
    b 表
    djs19920210
        4
    djs19920210  
    OP
       201 天前
    查询结果
    zakokun
        5
    zakokun  
       201 天前
    你 ab 表的图片是一样的;
    具体结果这个你可以 explain 一下,看看用到的索引。因为你的 bid 是 b 表的主键 id ,所以有可能是用 b 的主键索引,因此顺序是按照 b 表的
    Ariver
        6
    Ariver  
       201 天前 via iPhone
    没有 order by 的时候的顺序是不稳定的。不要依赖这个写逻辑。
    Cihua
        8
    Cihua  
       200 天前
    STRAIGHT_JOIN ?
    orzwalker111
        9
    orzwalker111  
       200 天前 via iPhone
    1 left 不能决定会用左表作为驱动表,驱动表是小表,在决定哪个表做驱动表的时候,应该是两个表按照各自的条件过滤,过滤完成之后,计算参与 join 的各个字段的总数据量,数据量小的那个表,就是“小表”,应该作为驱动表
    2 如果有 left 语义,应该将被驱动表字段放在 on ,不要放在 where
    orzwalker111
        10
    orzwalker111  
       200 天前 via iPhone
    sql 中涉及查询时 a 三个字段,b 两个,b 小表,作为驱动表
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1254 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 18:47 · PVG 02:47 · LAX 11:47 · JFK 14:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.