_陈哈哈 2021-05-26 14:00 采纳率: 0%
浏览 1239

MySQL5.7,left join关联排序查询,多次查询的顺序竟然不一样?

下面是测试表t_a、t_b;innodb,都只有主键索引,sort_str为varchar类型,sort_int为int类型

mysql> select * from t_a;
+----+-------+----------+----------+---------+------+
| id | name  | sort_int | sort_str | exam_id | w_id |
+----+-------+----------+----------+---------+------+
|  1 | a     |      111 | 111      |    1001 |    1 |
|  2 | bb    |      111 | 111      |    1002 |    2 |
|  3 | ccc   |      111 | 111      |    1003 |    3 |
|  4 | dddd  |      111 | 111      |    1004 |    4 |
|  5 | eeeee |      111 | 111      |    1005 |    5 |
+----+-------+----------+----------+---------+------+
5 rows in set (0.00 sec)

mysql> select * from t_b;
+---------+---------+----------+----------+----------+------+
| exam_id | project | sort_int | sort_str | other_id | u_id |
+---------+---------+----------+----------+----------+------+
|       1 | 语文    |      111 | 111      |     1001 |    1 |
|       2 | 数学    |      111 | 111      |     1002 |    2 |
|       3 | 生物    |      111 | 111      |     1003 |    3 |
|       4 | 化学    |      111 | 111      |     1004 |    4 |
|       5 | 物理    |      111 | 111      |     1005 |    5 |
+---------+---------+----------+----------+----------+------+
5 rows in set (0.00 sec)

下面通过左连接查询,多次查询发现,相同的SQL,返回的结果顺序顺序会不同,请教一下这种情况的原理是咋回事。。关联字段没有索引,不是主键。

mysql> SELECT a.id,a.`name`,a.sort_int,a.sort_str,b.project from t_a a LEFT JOIN t_b b ON a.w_id=b.u_id where a.sort_int='111' ORDER by a.sort_int limit 5;
+----+-------+----------+----------+---------+
| id | name  | sort_int | sort_str | project |
+----+-------+----------+----------+---------+
|  3 | ccc   |      111 | 111      | 生物    |
|  4 | dddd  |      111 | 111      | 化学    |
|  5 | eeeee |      111 | 111      | 物理    |
|  1 | a     |      111 | 111      | 语文    |
|  2 | bb    |      111 | 111      | 数学    |
+----+-------+----------+----------+---------+
5 rows in set (0.00 sec)

mysql> SELECT a.id,a.`name`,a.sort_int,a.sort_str,b.project from t_a a LEFT JOIN t_b b ON a.w_id=b.u_id where a.sort_int='111' ORDER by a.sort_int limit 5;
+----+-------+----------+----------+---------+
| id | name  | sort_int | sort_str | project |
+----+-------+----------+----------+---------+
|  5 | eeeee |      111 | 111      | 物理    |
|  1 | a     |      111 | 111      | 语文    |
|  2 | bb    |      111 | 111      | 数学    |
|  3 | ccc   |      111 | 111      | 生物    |
|  4 | dddd  |      111 | 111      | 化学    |
+----+-------+----------+----------+---------+
5 rows in set (0.00 sec)
 

  • 写回答

2条回答 默认 最新

  • 铭睿科技老郭 2021-05-26 14:16
    关注

    这是数据库系统的“”故意“”设计。

    如果没有指定ORDER BY语句,则数据库不保证以特定顺序返回结果。 
    如果指定ORDER BY语句,数据库系统r将对行进行排序,并按请求的顺序返回。

    但是,如果该顺序不是确定性的,即可能有重复的值,则在每个具有相同值的组中,由于与上述相同的原因,该顺序是“随机的”
    确保确定性顺序的唯一方法是在ORDER BY子句中包含保证的唯一列或列组(例如主键)。

    评论

报告相同问题?

悬赏问题

  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀