我的表格如下:
+------------------------+
| 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是要开始的行。
答案 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是顺序的,因此输出似乎已排序