2012-02-22 119 views
1

所以基本上我有这样的范围(SQL):PostgreSQL中,奇数OFFSET/LIMIT行为(记录命令)

scope.to_sql 
=> "SELECT \"offers\".* FROM \"offers\" INNER JOIN \"cities_offers\" ON \"offers\".\"id\" = \"cities_offers\".\"offer_id\" WHERE \"cities_offers\".\"city_id\" = 2 AND \"offers\".\"category_id\" IN (2) AND (offers.category_id is NOT NULL) ORDER BY offers.discount desc LIMIT 25 OFFSET 0" 

不知何故记录命令是用于上面的查询,并且在同一一个没有LIMIT和OFFSET不同:

scope[6] 
=> #<Offer id: 8629 ... 

scope.except(:offset, :limit)[6] 
=> #<Offer id: 8729 ... 

两个8629个8729记录具有相同discount值(I承属性)。

如果可以在这些情况下保持相同的记录排序,您可以请教建议吗?

回答

5

关系数据库是基于集合的,因此本质上是无序的; ORDER BY子句指定结果集中记录的顺序只有。如果ORDER BY子句中的表达式的两行具有相同的值,则运行相同的查询两次可能会将这些行返回到不同的位置;通过添加LIMIT和OFFSET来改变查询,通过更有可能制造不同的订单而使事情变得更糟。

如果您希望数据库以特定顺序为您提供行,您必须必须完全指定您的ORDER BY子句中的顺序。你必须增加更多的order呼叫您的范围:

...order('offers.discount desc, offers.created_at asc') 

或类似的,根据具体的顺序,你需要的东西。

+0

是的,那正是我所需要的。非常感谢 – 2012-02-22 19:35:25