Vla*_*ich 1 sql postgresql activerecord ruby-on-rails sql-order-by
所以基本上我有这个范围(sql):
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"
Run Code Online (Sandbox Code Playgroud)
不知何故,上述查询的记录顺序不同,而且没有LIMIT和OFFSET的记录顺序不同:
scope[6]
=> #<Offer id: 8629 ...
scope.except(:offset, :limit)[6]
=> #<Offer id: 8729 ...
Run Code Online (Sandbox Code Playgroud)
8629和8729记录具有相同的discount值(我按顺序排列的属性).
如果可以在这些情况下保持相同的记录订购,请您提供建议吗?
关系数据库是基于集合的,因此本质上是无序的; 结果集中记录的顺序仅由ORDER BY子句指定.如果两行在ORDER BY子句中具有相同的表达式值,则运行相同的查询两次可能会返回不同位置的行; 通过添加LIMIT和OFFSET来改变查询只会通过更有可能使不同的订单变得更糟.
如果希望数据库按特定顺序为您提供行,则必须在ORDER BY子句中完全指定顺序.您必须order在范围中为调用添加更多内容:
...order('offers.discount desc, offers.created_at asc')
Run Code Online (Sandbox Code Playgroud)
或类似的东西,取决于您需要的具体顺序.