2011-01-18 4 views
1

그래서 나는이에 영구적 인 이미지의 집합을 추가 할단일 쿼리에서 임의의 레코드와 특정 레코드를 가져 오겠습니까?

SELECT foo FROM `imageTable` ORDER BY RAND() LIMIT 0, 12; 

내 클라이언트와 같은 쿼리에 의해 채워 커버 플로우 스타일 이미지 회전 목마가있다. 결과가 사용되는 방식 때문에 원래 레코드의 일부로 레코드를 만들 수 있다면 매우 편리 할 것입니다.

나는 내가 ID를 가진 레코드가 반드시 결과 집합에있을 것입니다 희망하지만, RAND() 아니 전체 세트를 섞어되었다

SELECT foo FROM `imageTable` WHERE `id` = 'x' OR `id` = 'y' 
    OR `id` IS NOT NULL ORDER BY RAND() LIMIT 0, 12; 

을 시도했다.

내 질문에 하나의 쿼리가 x 영구 레코드 및 y 임의의 레코드를 제공 할 수 있는지 여부입니다? 아드리안 세라 핀의 답변을 사용 REVISED 쿼리

는 // 편집 :

(SELECT * FROM `imageTable` ORDER BY RAND() LIMIT 0, 6) 
UNION 
(SELECT * FROM `imageTable` WHERE `id` = 'foo' OR `id` = 'bar' OR `id` = 'baz') 

답변

4

당신은 SQL에서 노조 명령을 시도 할 수 있습니다.

select random 
    union 
select choosed 
+1

답장을 보내 주셔서 감사합니다. 그건 잘된거야! 새로운 것을 가르쳐 주셔서 감사합니다! – jerrygarciuh

1

당신은 노동 조합을 시도 할 수 있습니다 ...

 
(SELECT foo FROM imageTable WHERE id not in ('x','y') ORDER BY RAND() LIMIT 0, 12;) 
UNION 
(SELECT foo FROM imageTable WHERE id in ('x','y') 
ORDER BY a LIMIT 10; 

+0

감사합니다. 존! 나는 ('x', 'y')를 사용하는 것에 대해 몰랐다. 그래서 나는 새로운 트릭을 배웠다. 감사! – jerrygarciuh

1

연합 (EU) 함께하지만, 당신은 대신 여러 OR 제표의에서 사용할 수있는 더 번 이상 표시되지 X와 Y를 방지 더 간결하다.

SELECT foo FROM (
    SELECT foo FROM `imageTable` 
    WHERE id NOT IN ('x','y','z') 
    ORDER BY RAND() LIMIT 0, 9 # reduce by 3 
) A 
UNION ALL 
SELECT foo FROM (
    SELECT foo FROM `imageTable` 
    WHERE id IN ('x','y','z') 
) B 
ORDER BY RAND() # order again so that x,y,z are anywhere in the set 
+0

고마워요! NOT IN을 추가하는 것이 좋습니다! – jerrygarciuh

+0

UNION ALL 대신 UNION' *을 사용하면 결과에서 중복을 제거 할 수 있다는 인상을 받았습니다. 이제 사실이라면 LIMIT 10이 무작위 쿼리에 적용되기 전이나 후에 문제가 발생할 수 있는지 여부를 알 수 없습니다. –

관련 문제