我试图用DataMapper选择随机数据集,但似乎没有这样的功能支持。
例如,我有一组数据:
+-------------------+
| ID | Name | Value |
+-------------------+
| 1 | T1 | 123 |
| 2 | T2 | 456 |
| 3 | T3 | 789 |
| 4 | T4 | 101 |
| ----------------- |
| N | Tn | value |
可能有很多数据,超过10万行。
我需要将数据映射到对象:
class Item
include DataMapper::Resource
property :id, Serial
property :name, String
property :value, String
end
所以,问题是:如何从表中选择随机数据?
SQL中的类似查询将是:
SELECT id, name, value FROM table ORDER BY RAND() LIMIT n;
答案 0 :(得分:6)
OP之后的很长一段时间,但由于这是第一次google点击“datamapper random row”......
使用纯DataMapper,无需对连续ID等进行假设,您可以这样做:
Item.first(:offset => rand(Item.count))
导致查询:
SELECT COUNT(*) FROM `items`
SELECT <fields> FROM `items` ORDER BY `id` LIMIT 1 OFFSET <n>
如果您更喜欢单个查询,可能会降低速度,您可以这样做:
Item.all.sample
结果:
SELECT <fields> FROM `items` ORDER BY `id`
显然,如果需要,请将其包装在事务中。
答案 1 :(得分:2)
我一般不关心字面上检索随机记录。在这种情况下,我使用了略微不同的范例。
其中k是代码中生成的小于N-n的随机数。在大多数情况下都是足够随机的,即使这些记录在您用于ORDER BY的内容中有些连续。
答案 2 :(得分:1)
您可以生成随机数x&lt; number_of_rows,只需获取该ID。
您也可以尝试直接输入SQL,如下所示:
find_by_sql(<<-SQL
SELECT `id`, `name`, `value` FROM table ORDER BY RAND() LIMIT n;
SQL, :properties => property_set)
您需要指定:属性,以便与您的属性集进行映射。