我已经改写了这个问题,因为我之前的解释引起了混乱。
在SQL世界中,您有一个应用查询的初始记录集。此查询的输出是结果集。通常,初始记录集是整个记录表,结果集是初始记录集中与查询规则集匹配的记录
我有一个用例,我需要我的应用程序偶尔只对表中的一部分记录进行操作。如果一个表中有10,000条记录,我希望我的应用程序只能存在前1000条记录。这些应该是每次相同的1,000条记录。换句话说,我希望初始记录集是表中的前1,000个设备(按主键排序时),而结果集是这些设备的结果记录前1,000台设备。
已经提出了一些解决方案,并且揭示了我的初步描述并不十分清楚。更明确一点,我并不是想实现分页。我也没有试图限制我收到的结果数量(.limit(1,000)
确实会达到的结果)。
谢谢!
答案 0 :(得分:-1)
这是您不明白的问题:
这会导致两个调用出现问题,因为限制会限制查询结果,而不是执行查询的数据库行。
这不是Rails的事情,这是一个SQL的事情。
Device.limit(n)
运行SELECT * FROM device LIMIT n
Limit始终返回查询结果集的子集。
first(n)
会完成你想要的吗?它将按PK对结果集进行排序,并限制返回的结果数。
答案 1 :(得分:-1)
SQL语句可以链接在一起。因此,如果您有子集,则可以使用它执行其他查询。
my_subset = Device.where(family: "Phone")
# SQL: SELECT * FROM Device WHERE `family` = "Phone"
my_results = my_subset.where(style: "Touchscreen")
# SQL: SELECT * FROM Device WHERE `family` = "Phone" AND `style` = "Touchscreen"
也可以写成:
my_results = Device.where(family: "Phone").where(style: "Touchscreen")
my_results = Device.where(family: "Phone", style: "Touchscreen")
# SQL: SELECT * FROM Device WHERE `family` = "Phone" AND `style` = "Touchscreen"
根据您的问题,如果您想要选择前1,000行(按主键排序pkey
)然后再查询,则需要执行以下操作:
my_results = Device.find_by_sql("SELECT *
FROM (SELECT * FROM devices ORDER BY pkey ASC LIMIT 1000)
WHERE `more_searching` = 'happens here'")
答案 2 :(得分:-2)
您可以专门询问一组ID:
Device.where(id: (1..4).to_a)
这将构建一个WHERE
子句,如:
WHERE id IN (1,2,3,4)