2016-12-11 6 views
0

저는 SQL에 익숙하지 않아 다음과 같은 문제가 있습니다.이 쿼리의 결과를 임의의 레코드를 추출하는 다른 쿼리의 원본으로 사용하려면 어떻게해야합니까?

테이블에서 임의의 레코드를 선택하는 쿼리를 구현하려고합니다.

나는이 흥미로운 기사를 발견했다 :

http://jan.kneschke.de/projects/mysql/order-by-rand/ 그래서 나는이 예제를 다음입니다 : 그것은 좋은 작품을 보인다

SELECT name 
    FROM random AS r1 JOIN 
     (SELECT (RAND() * 
        (SELECT MAX(id) 
         FROM random)) AS id) 
     AS r2 
WHERE r1.id >= r2.id 
ORDER BY r1.id ASC 
LIMIT 3; 

.

이제 내 문제는 내가 상황에 적응하려고하는 것입니다.

SELECT * FROM room_media rm1 
JOIN room r ON rm1.id_room = r.id 
JOIN room_tipology rt ON r.id_room_tipology_fk = rt.id 
where rt.id = 1 
:

나는 내 데이터의 소스하지만이 쿼리에 의해 반환 된 레코드의 전체 세트에서 3 임의 reocords를 추출해야하는 대신 임의 테이블로하지 않는 간단한 단일 임의 테이블이

이 쿼리의 결과를 테이블로 간주하고 이전의 임의의 테이블 대신 사용하는 방법은 무엇입니까? 이런 식으로하면 성능 문제가 발생할 수 있습니까?

+0

쿼리가 3 개의 임의의 행을 반환하지 않습니다. 단일 임의 ID에서 시작하여 3 개의 행을 반환합니다. –

+0

@GordonLinoff 첫 번째? – AndreaNobili

+0

@AndreaNobili 예, 첫 번째 쿼리입니다. 이는 링크의 예제 코드에서 직접 설명합니다. 아래로 스크롤하면 링크가 여러 행에 대한 솔루션을 제공합니다. 기본적으로 3 가지 값을 얻을 때까지 설정에 가장 적합한 1 행 검색어를 여러 번 실행합니다 (예 : 구멍이 있거나 ID가없는 경우). 당신은 그 원칙을 당신의 정확한 요구 사항 (절차/기능/프로그래밍 언어)을 사용하고 조정할 수 있습니다. 몇 가지 (빠른) 색인 조회가 필요하기 때문에 이보다 훨씬 빨리 얻는 것이 어렵습니다 (특별한 상황/요구 사항이 필요합니다). – Solarflare

답변

0

귀하의 방법은 3 임의의 행을 얻지 못합니다. 단일 임의의 ID에서 시작하여 id에 의해 정렬 된 세 개의 행을 가져옵니다. 이들은 매우 다릅니다.

"n"개의 임의 레코드를 얻는 가장 간단한 방법은 order by rand()limit을 사용하는 것입니다. 따라서 다음으로 시작하십시오.

SELECT * -- you should list column names explicitly 
FROM room_media rm1 JOIN 
    room r 
    ON rm1.id_room = r.id JOIN 
    room_tipology rt 
    ON r.id_room_tipology_fk = rt.id 
WHERE rt.id = 1 
ORDER BY rand() 
LIMIT 3; 

임의의 행을 가져 오는 데는 다른 방법이 많이 있습니다. 위의 방법이 성능 목표를 충족하지 못할 때 일반적으로 사용됩니다.

+0

아니요, 작동하지만 많은 레코드에서 성능 문제가 발생할 수 있습니다. 나는 첫 번째 쿼리의 결과를 두 번째 쿼리와 결합하기를 원한다. – AndreaNobili