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

Listening_倾听 2017-12-26 09:38:31
左连接后,mysql对结果集重新进行了排序,而不是按照笛卡尔积之后的结果集顺序,这是为什么。

a表


b表


select * from a left join b on a.id=b.id;


结果集


没有按照 a 表 的 id 字段 1 2 4 3 排序了。
...全文
6009 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
HttpCookie 2021-05-21
  • 打赏
  • 举报
回复 2
left join时,关联字段没有走索引 可能会导致结果集不一致
白马义从 2018-04-10
  • 打赏
  • 举报
回复
给左表加上自增ID,然后join后排序。能不能达到你的需求? 左表按下面这种形式 SELECT @rn:=@rn+1 AS rn , test.XX FROM test,(SELECT @rn:=0) t1
zjcxc 2017-12-26
  • 打赏
  • 举报
回复
order by a.id, b.id
Listening_倾听 2017-12-26
  • 打赏
  • 举报
回复
引用 2 楼 zjcxc 的回复:
建议你看执行计划
没有 order by 是不保证顺序的,查询优化器可以按照能够尽快出结果的方案去处理查询,所以顺序是未知的


谢谢,那我要根据某个表查出的某个字段来排序该怎么弄。

比如在某种规则下我查出 a 表的id字段 是 按照 1 3 2 4 排列的,然后我要让b表查到的数据按这个字段排序该怎么做。

这就是我一开始想用left join 拿到这样的排序的原因,有没有类似这样的:
order by field(a.id, (select 语句查出某个字段排序的值))

类似这样的方法。
rucypli 2017-12-26
  • 打赏
  • 举报
回复
没有指定order by 的结果集并不能保证按照某种顺序执行
zjcxc 2017-12-26
  • 打赏
  • 举报
回复
建议你看执行计划 没有 order by 是不保证顺序的,查询优化器可以按照能够尽快出结果的方案去处理查询,所以顺序是未知的
Listening_倾听 2017-12-26
  • 打赏
  • 举报
回复
left join 不应该是以左表为基准跟右表进行笛卡尔积吗,怎么发现结果集的顺序是反过来的。

select * from b left join a on a.id=b.id;


结果集


b表 left join a表居然会按a表的顺序排序,有点颠覆我的认知啊

笛卡尔积
zjcxc 2017-12-26
  • 打赏
  • 举报
回复
引用 6 楼 flysky2015 的回复:
[quote=引用 5 楼 zjcxc 的回复:] order by a.id, b.id
不是这个意思,意思是要b表的id 字段按照 1 3 2 4 这样的顺序排,但1 3 2 4 一开始是不知道的,查了之后才知道,所以不能用 order by field(id, 1, 3, 2, 4),但是要实现这个效果。[/quote] 这是什么顺序,不会说是存储顺序吧? 存储顺序是不存在的,数据并不总是最后 insert 的存储在最后
Listening_倾听 2017-12-26
  • 打赏
  • 举报
回复
引用 3 楼 rucypli 的回复:
没有指定order by 的结果集并不能保证按照某种顺序执行
那有没有办法实现4楼的那种效果呢?
Listening_倾听 2017-12-26
  • 打赏
  • 举报
回复
引用 5 楼 zjcxc 的回复:
order by a.id, b.id
不是这个意思,意思是要b表的id 字段按照 1 3 2 4 这样的顺序排,但1 3 2 4 一开始是不知道的,查了之后才知道,所以不能用 order by field(id, 1, 3, 2, 4),但是要实现这个效果。

56,912

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧