2011-11-09 4 views

답변

2

내가 할 줄 :

SELECT * FROM Foo ORDER BY ID LIMIT 1 --First row 
UNION 
SELECT * FROM Foo WHERE ID NOT IN (SELECT ID FROM Foo ORDER BY ID LIMIT 1) 
    ORDER BY RAND() LIMIT 3 
+0

고마워요. – insomiac

0
(SELECT * FROM table ORDER BY id ASC LIMIT 1) UNION (SELECT * FROM table ORDER BY RAND() LIMIT 3) 

, 당신은하지만, 임의의 부분에서 첫 번째 행을 선택하지 할 수 있습니다 ABY 당신은 내가 응용 프로그램 계층에서이 일을 추천 할 것입니다 ANY 3

+0

이 하나 하나 위의 비슷합니다 .. – insomiac

0

말했다 나중에 캐싱을 소개 할 수 있습니다. 또한 애플리케이션 내에서 데이터베이스 레이어보다 무작위로 작업하는 것이 훨씬 빠릅니다.

// Your database stuff 

while ($row = $result->fetchRow()) { 
    $results[] = $row; 
} 

$firstResult = array_shift($results); 

for ($i = 0 ; $i < 3 ; $i++) { 
    $randomKey = array_rand($results); 
    $randomResults[] = $results[$randomKey]; 
} 

echo $firstResult; 

foreach ($randomResults as $randomResult) { 
    echo $randomResult; 
} 
+0

을 매우는 해당 테이블에있는 행 수에 따라 달라. 10 행 또는 20 행만있는 경우 캐싱을 사용하는 것이 좋습니다. 그러나 테이블이 100 000 개의 행으로 구성된다면? 네 개를 가져 오기 위해서만 데이터베이스 연결을 통해 이들 모두를 전송하고 싶지는 않을 것입니다. – Yogu

+0

동의. 그러나 주문 부작위와 노동 조합에 대해서도 마찬가지라고 할 수있다. –

+0

그러나 모든 결과를 가져올 필요는 없지만 임의 함수로 선택한 세 가지 결과 만 가져올 수 있습니다. 그런 다음 LIMIT를 사용하여 이러한 행을 정확하게 선택할 수 있습니다. – Yogu

관련 문제