2016-10-26 5 views
0

다음은 샘플 테이블입니다.MySQL 다중 쿼리 결합

ColZero | ColOne | RoColTwo 
--------+--------+-------- 
    1 | one | tag1 
    2 | two | tag1 
    3 | three | tag2 
    4 | four | tag2 
    5 | five | tag3 

다음 쿼리가 있습니다.

SELECT `ColOne` FROM `Table` WHERE `ColTwo` = ? ORDER BY rand() LIMIT 1; 

나는 하나의 쿼리에서 RowTwo의 여러 값을 사용하여 여러 행을 선택하고 싶지만 각 행은 여전히 ​​무작위한다.

이 작업에는이 쿼리의 인스턴스를 가변적으로 병합하여 새로운 단일 쿼리로 만드는 작업이 포함됩니다.

어떻게이 작업을 하나의 쿼리로 수행 할 수 있습니까? (I 가능한이 빨리 만들려고, 그래서 10-30 요청 반대로 모두가 하나 개의 요청으로 수행 얻고 것은 큰 플러스입니다.)

+0

"행"과 "색"이라는 용어를 혼동하고 있습니까? –

답변

1
당신은 RowTo

에 대해 서로 다른 값을 사용하여 노동 조합을 사용할 수

아마

+0

타이! 유일한 문제는 고정 된 수의 행을 강제로 선택하는 것입니다. – Lolums

+0

yIn 어딘가에 예 .. 당신은 오직 한도와 수의 변경을 바꿀 수 있습니다. – scaisEdge

2

SELECT `RowOne` FROM `Table` WHERE `RowTwo` = ? ORDER BY rand() LIMIT 1 

union 

SELECT `RowOne` FROM `Table` WHERE `RowTwo` = ? ORDER BY rand() LIMIT 1 

union 

SELECT `RowOne` FROM `Table` WHERE `RowTwo` = ? ORDER BY rand() LIMIT 1 

union 

SELECT `RowOne` FROM `Table` WHERE `RowTwo` = ? ORDER BY rand() LIMIT 1 ; 
당신이 원하는 것을 할 수있는 가장 효율적인 방법은 변수를 사용하는 것입니다 : 동적 SQL을 사용하지 않으려면

SELECT t.* 
FROM (SELECT t.*, 
      (@rn := if(@r = RowTwo, @rn + 1, 
         if(@r := RowTow, 1, 1) 
         ) 
      ) as rn 
     FROM `Table` t CROSS JOIN 
      (SELECDT @r := '', @rn := 0) params 
     WHERE `RowTwo` IN (?, ?, ?) 
     ORDER BY RowTwo, rand() 
    ) t 
WHERE rn = 1; 

을 당신은, 당신이 고려할 수있는 값의 무한 수를 지원하려면 :

WHERE FIND_IN_SET(RowTwo, ?) > 0 

어쨌든 명명 열 ROW는 (적어도 나를 위해)인지 부조화를 유발합니다.

+0

타이! 죄송합니다. 이름이 고정되었습니다. 나는 이것을 이해하기 위해 고심하고있다. 'params' 대신에 무엇이 나옵니까? – Lolums

+0

무슨 뜻인지 모르겠습니다. '?'는'RowTwo'를 검사 할 값입니다. 'where' 절을 생략하여 각 값에 임의의 행을 가져올 수 있습니다. –