2011-08-01 5 views
1

테이블에서 무작위 레코드를 선택하고 싶지만 특정 필드에서 더 높은 값으로 바이어스하고 싶습니다. 어떤 레코드도 0 % 확률로 선택되지 않도록하고 싶습니다. 선택의 가능성이 적습니다.바이어스가있는 MySQL 무작위 레코드

이 문서에서

, 나는 임의 선택이 저하 될 수 있다는 것을 알고 그리고 당신은 그 속도를 높일 수 : http://wanderr.com/jay/order-by-slow/2008/01/30/

그러나 조인과 함께 몇 테이블을 처리하는 경우에 대한 그리고 어디 성명 및 원하는 랜덤을 편향하는 방법으로 필드 중 하나를 사용하십시오 (이 필드의 값이 높을수록 선택 가능성이 높음)? 예를 들면 :

SELECT a.id, a.date, a.userid, b.points FROM table_a AS a INNER JOIN table_b AS b ON (a.userid = b.userid) WHERE DATE_SUB(CURDATE(), INTERVAL 60 DAY) <= a.date 

가 어떻게 b.points의 높은 값으로 편향 될 수있는 효율적인 아니라 진정으로 임의의 쿼리로 위의 돌 수 있었다 ?

답변

0

내 2 센트는 편견은 다음과 같이 수행 할 수 있습니다 :

당신은 무작위로> (75), 3 녹화> (50),이 기록입니다 (5 개) 기록을 선택

(100), 0 사이의 점수는 가정 > 25, 1 레코드> 0

이제이 11 개의 레코드에서 무작위로 추출하면 높은 점수로 편향됩니다.

는 SQL에 넣어하려면 조인 된 테이블 "ABC"

Select * from (
select * from abc where b.points > 75 order by rand() limit 5 
cross join 
select * from abc where b.points > 50 and b.points <75 order by rand() limit 3 
cross join 
select * from abc where b.points > 25 and b.points <50 order by rand() limit 2 
cross join 
select * from abc where b.points > 0 and b.points <25 order by rand() limit 1 
) as result 
order by rand() limit 3 

성능 현명한, 당신의 링크를 한 번 봐 가지고이 anwser를 업데이트 할 예정이라고합니다.