加入时确保结果顺序,而不使用order_by

时间:2009-10-16 20:55:48

标签: sql mysql

我有一个mysql插件,它将以指定的顺序返回结果集。部分结果集包含一个外键,我想加入该键,同时确保订单保持不变。

如果我这样做:

    select f.id, 
           f.title 
      from sphinx s 
inner join foo f on s.id = f.id 
     where query='test;filter=type,2;sort=attr_asc:stitle';

看起来我按照sphinx返回的顺序得到了我的结果。这是一个mysql的怪癖,还是我确信连接不会改变顺序?

5 个答案:

答案 0 :(得分:4)

如果您需要在查询结果中保证订单,请使用ORDER BY。还有别的想法。

为了对此有所了解,许多数据库将执行步骤划分为可根据查询的执行计划,可用CPU的数量以及数据库可以推断的安全类型而变化的方式。如果在多个线程上并行运行查询,则结果可能会有所不同。如果解释计划发生变化,结果可能会有所不同。如果同时运行多个查询,结果可能会有所不同。如果某些数据缓存在内存中,结果可能会有所不同。

如果您需要保证订单,请使用ORDER BY。

答案 1 :(得分:1)

我不相信sql保证哪个表驱动最终的排序顺序。话虽如此,除非我对MySQL重写您的查询以使订单更改的方式感到非常惊讶。

答案 2 :(得分:1)

SQL不保证SELECT的结果集顺序,包括连接。

答案 3 :(得分:1)

您不能这样做,SQL不保证此类操作后的订单。

答案 4 :(得分:1)

除非您指定ORDER BY语句,否则不会保证特定订单。 由于您提到您使用的是以指定顺序返回结果集的插件,因此我假设该插件生成的SQL将添加ORDER BY语句。 如果你做了连接,要注意的一件事是你要加入的表的列名。如果它们的名称相同,那么您的查询可能会使用不同的列进行制动或排序。