2016-10-26 6 views
0

Hier ist eine Beispieltabelle.MySQL Mehrere Abfragen kombinieren

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

Ich habe folgende Abfrage.

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

Ich möchte mehrere Zeilen auszuwählen, mehrere Werte von RowTwo in einer einzigen Abfrage verwenden, aber jede Zeile hat noch zufällig sein.

Hierbei wird eine variable Anzahl von Instanzen dieser Abfrage zu einer neuen einzelnen Abfrage zusammengeführt.

Wie kann dies in einer Abfrage durchgeführt werden? (Ich versuche, diese so schnell wie möglich zu machen, so bekommen sie alle in einer Anfrage durchgeführt, wie auf 10-30 Anfragen Gegensatz ist ein großes Plus.)

+0

Verwechseln Sie die Begriffe "Row" und "Col"? –

Antwort

1

Sie union anderen Wert mit für RowTo verwenden könnte

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! Das einzige Problem ist, dass die Auswahl einer festen Anzahl von Zeilen erzwungen wird. – Lolums

+0

yIn irgendwie yes .. Sie können nur das Limit ändern und die Anzahl der Union .. – scaisEdge

2

Wahrscheinlich die effizienteste Art und Weise zu tun, was Sie wollen, ist Variablen verwenden:

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; 

Wenn Sie die dynamische SQL nicht verwenden wollen, und Sie wollen eine unbestimmte Anzahl von Werten unterstützen, könnte man erwägen :

WHERE FIND_IN_SET(RowTwo, ?) > 0 

In jedem Fall verursacht die Benennung von Spalten ROW (zumindest für mich) kognitive Dissonanz.

+0

Ty! Hoppla, die Namensgebung wurde korrigiert. Ich habe Mühe, etwas davon zu verstehen. Was geht anstelle von "Params"? – Lolums

+0

Ich bin mir nicht sicher, was du meinst. Die "?" Sind die Werte, für die Sie 'RowTwo' überprüfen möchten. Sie können diese where-Klausel weglassen, um für jeden Wert eine zufällige Zeile zu erhalten. –