Php mysql链表排序查询,为什么能工作?

Php mysql链表排序查询,为什么能工作?,php,mysql,sql,linked-list,Php,Mysql,Sql,Linked List,我的桌子看起来像这样: +------------------------+ | id | title | position | +------------------------+ | 1 | test 2 | 3 | +------------------------+ | 2 | test 3 | 1 | +------------------------+ | 3 | test 1 | 0 | +---------------------

我的桌子看起来像这样:

+------------------------+
| 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是要开始的行。

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

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

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

你自己看看,试试看


注意:数据库不能保证像您所说的那样工作,只是大多数数据库都是这样工作的。您应该不要依赖这种行为,因为对模式或查询的微小更改可能会毁掉您的一整天!还要注意,如果
id
是一个(主键?)键,那么插入顺序可能会被以下事实所覆盖:数据库将按照索引的顺序拉出行。

“它为什么工作?”——现在出现了一个转折。大多数人来这里询问的是完全相反的问题。如果查询中没有
orderby
子句,则无法保证返回行的顺序。MySQL可以按照其选择的任何顺序自由返回行。您观察到的可重复行为是由于MySQL碰巧使用的查询执行计划造成的;如果MySQL正在使用索引,则行可能会按照它们在索引中出现的顺序返回。如果MySQL正在扫描一个表,那么这些行可能会按照它们在表中出现的顺序返回。+1。如果没有
ORDER BY
子句,返回行的顺序肯定无法保证。如果查询中没有ORDER BY子句,数据库可以按任意顺序返回行。@spencer7593谢谢-我还扩展了我的答案,包括可能改变顺序的键。。。