2012-02-22 8 views
1

ので、基本的に、私はこのスコープ(SQL)を有する:PostgreSQLでは、奇数OFFSET /制限動作(記録順)

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" 

は、どういうわけか、レコードの順序は、制限なく上記のクエリと同じもののために異なっており、オフセット

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

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

両方8629と8729のレコードが同じdiscount値(私はで注文属性)を持っています。

このような状況で同じレコードを注文することは可能でしょうか?

答えて

5

リレーショナルデータベースはセットベースであり、したがって本質的に順序付けられていません。結果セット内のレコードの順序は、ORDER BY句でと指定されています。 2つの行がORDER BY句の式に同じ値を持つ場合、同じクエリを2回実行すると、異なる位置の行が返されることがあります。 LIMITとOFFSETを追加してクエリを変更すると、異なる注文を発生させる可能性が高くなります。

データベースに特定の順序で行を渡す場合は、は、にORDER BY句の順序を完全に指定する必要があります。あなたが必要とする特定の順序に依存

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

またはそのような何か:あなたはあなたの範囲内orderコールに多くを追加する必要があります。

+0

はい、それは私が必要としていたものです。どうもありがとう –

関連する問題