2016-10-26 14 views
0

ここにサンプルテーブルがあります。複数のクエリを組み合わせる

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; 

Iは、単一のクエリ内RowTwoの複数の値を使用して、複数の行を選択したいのですが、それぞれの行は依然としてランダムでなければなりません。

これには、このクエリの可変数のインスタンスを新しい単一のクエリにマージすることが含まれます。

これはどのように1つのクエリで実行できますか? (私は10-30の要求とは反対に、それはすべてが一つのリクエストで行われ得ることは大きなプラスである、可能な限りこれを限り迅速にするためにしようとしています。)

+0

"行"と "色"の用語を混同していますか? –

答えて

1

あなたはRowTo

に異なる値を使用して組合を使用することができます
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 ; 
+0

Ty!唯一の問題は、固定数の行を強制的に選択することです。 – Lolums

+0

yin someway yes ..あなたは組合の限度と数を変更するだけでいいです。 – scaisEdge

2

おそらくあなたが欲しいものを行うための最も効率的な方法は、変数を使用することです:

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; 

あなたは、動的SQLを使用したくない、あなたは値の不特定多数をサポートしたい場合は、あなたが考えるかもしれません:

WHERE FIND_IN_SET(RowTwo, ?) > 0 

いずれの場合でも、ROWという名前を付けると(少なくとも私にとっては)認知の不調和が生じます。

+0

Ty!おっと、名前を固定しました。私はこれを理解するのに苦労しています。 'params'に代わるものは何ですか? – Lolums

+0

あなたが何を意味するか分かりません。 '?'は 'RowTwo'をチェックしたい値です。 'where'節を省略して、各値に対してランダムな行を得ることができます。 –

関連する問題