sql - postgresql,奇怪的 OFFSET/LIMIT 行为(记录顺序)

标签 sql ruby-on-rails postgresql activerecord 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"

上述查询的记录顺序与没有 LIMIT 和 OFFSET 的记录顺序不同:

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

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

8629 和 8729 记录都具有相同的 discount 值(我排序的属性)。

如果在这种情况下可以保留相同的记录排序,您能否提供建议?

最佳答案

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

如果您希望数据库以特定顺序为您提供行,您必须在 ORDER BY 子句中完全指定顺序。您必须向范围内的 order 调用添加更多内容:

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

或类似的东西,具体取决于您需要的特定顺序。

关于sql - postgresql,奇怪的 OFFSET/LIMIT 行为(记录顺序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9401314/

相关文章:

Sql Server 创建表查询

sql - 最后一张发票使用 Postgres

ruby-on-rails - 在响应中设置 Cache-Control header

ruby-on-rails - 如何在 Capybara 中获取表单的 Action ?

sql - 连续出现次数及其长度(高级间隙和孤岛问题)

php - postgresql 在执行准备好的语句时检查是否存在

java - postgresql中如何表示小数字?

mysql - WHERE 语句中的 REGEXP?

mysql - 用于提取具有单个日期条目的多行的 SQL 查询

mysql - 从Rails 3中的ActiveRecord查询MySQL中的一个月或一周的日期