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

2021-12-08 18:43:20 +08:00
 djs19920210
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 表的顺序排序出结果
1404 次点击
所在节点    程序员
10 条回复
liprais
2021-12-08 18:44:36 +08:00
sql 的结果集是无序的,除非你用 order by
djs19920210
2021-12-08 18:48:55 +08:00
djs19920210
2021-12-08 18:49:25 +08:00
b 表
djs19920210
2021-12-08 18:49:47 +08:00
查询结果
zakokun
2021-12-08 18:51:14 +08:00
你 ab 表的图片是一样的;
具体结果这个你可以 explain 一下,看看用到的索引。因为你的 bid 是 b 表的主键 id ,所以有可能是用 b 的主键索引,因此顺序是按照 b 表的
Ariver
2021-12-08 18:53:39 +08:00
没有 order by 的时候的顺序是不稳定的。不要依赖这个写逻辑。
djs19920210
2021-12-08 18:58:51 +08:00
Cihua
2021-12-09 09:46:22 +08:00
STRAIGHT_JOIN ?
orzwalker111
2021-12-09 13:03:32 +08:00
1 left 不能决定会用左表作为驱动表,驱动表是小表,在决定哪个表做驱动表的时候,应该是两个表按照各自的条件过滤,过滤完成之后,计算参与 join 的各个字段的总数据量,数据量小的那个表,就是“小表”,应该作为驱动表
2 如果有 left 语义,应该将被驱动表字段放在 on ,不要放在 where
orzwalker111
2021-12-09 13:08:50 +08:00
sql 中涉及查询时 a 三个字段,b 两个,b 小表,作为驱动表

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

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

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

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

© 2021 V2EX