mysql链表排序查询,为什么有效?

时间:2014-06-18 15:13:03

标签: php mysql sql linked-list

我的表格如下:

+------------------------+
| id | title  | position |
+------------------------+
|  1 | test 2 |        3 |
+------------------------+
|  2 | test 3 |        1 |
+------------------------+
|  3 | test 1 |        0 |
+------------------------+

我发现这个查询根据保存前一个id的位置字段检索排序的行。

SELECT
    *
FROM
    mytable AS t1
LEFT JOIN
    mytable AS t2
ON t2.position = t1.id

我想知道为什么这是有效的,因为没有order by子句,数据库不应该知道位置0是要开始的行。

2 个答案:

答案 0 :(得分:2)

结果取决于您将行插入表中的顺序。例如,如果在插入id = 2的行之前插入了id = 3的行,那么您将得到一个未排序的结果。

按照目前的情况,您将按id的顺序从t1中提取数据,因为这是您将元素放入表中的顺序

请参阅http://sqlfiddle.com/#!2/63a925/2并亲自试用。

N.B。数据库保证无法正常工作,只是大多数数据库以这种方式工作。您应该依赖此行为,因为对架构或查询的轻微更改可能会毁了您的一整天!另请注意,如果id是(主要?)键,则插入顺序可能会被数据库按索引顺序拉出行的事实所覆盖。

答案 1 :(得分:0)

该查询基于表1中的ID等于表2中的位置加入表2.由于表1中的ID是顺序的,因此输出似乎已排序