2009-06-12 4 views
2

DataMapperでランダムなデータセットを選択しようとしていますが、そのような機能はサポートされていないようです。例えばDataMapperでランダムデータを選択

、私はデータを設定している:、以上100Kの行データの多く

+-------------------+ 
| ID | Name | Value | 
+-------------------+ 
| 1 | T1 | 123 | 
| 2 | T2 | 456 | 
| 3 | T3 | 789 | 
| 4 | T4 | 101 | 
| ----------------- | 
| N | Tn | value | 

が存在する場合があります。

と私はオブジェクトにデータをマップする必要があります。

だから、
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; 

答えて

1

あなたはX < NUMBER_OF_ROWS乱数を生成し、ちょうどそのIDを取得することができます。

また、このように、直接SQLを入力試みることができる:

find_by_sql(<<-SQL 
    SELECT `id`, `name`, `value` FROM table ORDER BY RAND() LIMIT n; 
SQL, :properties => property_set) 

あなたが指定する必要がありますプロパティをけれども、それはあなたのプロパティセットとマップします。

+0

しかし、もし私がこのようなId'の配列を持っていたらどうでしょうか?1、3300、91928、234? さらに、データセットをフェッチする方法についても興味があります。 –

+0

答えを別の解決策で更新しました – cloudhead

2

一般的に、ランダムなレコードを文字通り検索するのは気にしません。この場合、私は少しずつ異なるパラダイムを使用します。

  1. あなたも名を
  2. SELECTのLIMITを名前、またはいくつかの機能を使用するn個のk、kは乱数である

をOFFSETでき//いくつかの番号を国防省値//または値BY ORDERあなたのコードではNn以下で生成されます。ほとんどの場合、レコードがORDER BYで使用するものと多少連続しているにもかかわらず、十分にランダムです。

6

OP後に長い時間が、これは「DataMapperのランダムな行」の最初のGoogleのヒットであるので、...純粋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` 

は、トランザクションでこれをラップします。

関連する問題