2009-06-12 4 views
2

DataMapper를 사용하여 임의의 데이터 세트를 선택하려하지만 그러한 기능 지원이없는 것처럼 보입니다.DataMapper로 무작위 데이터 선택

는 예를 들어, 나는 데이터의 설정 :

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

는 많은 데이터, 더 이상의 100,000 행이있을 수 있습니다.

와 나는 객체 데이터를 매핑해야합니다

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. 값 BY ORDER // 또는 값은 어떤 수를 MOD // 당신은 또한 이름
  2. SELECT LIMIT에 이름 또는 일부 기능을 사용할 N k는 임의의 번호입니다

케이 OFFSET 수 코드에서 Nn보다 적게 생성됩니다. ORDER BY에 사용하는 레코드가 다소 연속적이더라도 대부분의 경우 충분히 효율적입니다.

6

영업 후 오랜 시간이 있지만,이

순수 DataMapper를 사용, 등 연속 ID에 대한 가정을하지 않고 "datamapper 임의 행"에 대한 최초의 구글 히트 ... 때문에, 당신은 할 수 있습니다 : 쿼리 결과

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` 

는 트랜잭션이 포장.