2016-04-15 15 views
0

ich eine Tabelle (in mysql) wie folgt aus:mehrere Datensätze pro Zeile Abfrage

TABLE1

Id Name Age 
--------------- 
1 John 22 
2 Mary 17 
3 Peter 21 
4 Agnes 34 
5 Steve 14 
6 Bart 26 
7 Bob 32 
8 Vince 18 
... 

Was ich suche ist eine SELECT-Anweisung, wo ich 4 Datensätze erhalten können in eine Reihe. Ich meine, das Ergebnis der select-Anweisung wäre:

Id1 Name1 Age1 Id2 Name2 Age2 Id3 Name3 Age3 Id4 Name4 Age4 
----------------------------------------------------------- 
1 John 22 2 Mary 17 3 Peter 21 4 Agnes 34 
5 Steve 14 6 Bart 26 7 Bob 32 8 Vince 18 
... 

Ich denke, es wie ein Drehpunkt wäre ... Ist das möglich? Wenn ja, wie kann ich es erreichen? Ich muss einen Bericht füllen, indem ich 4 Datensätze in einer Zeile zeige, also würde ich gerne in der Lage sein, es aus einer Datenquelle zu machen, die genau diese Struktur zurückgibt. So auf den ersten Band/Reihe wird es

sein
rec1,rec2,rec3,rec4 

dann auf der zweiten Reihe:

rec5,rec6,rec7,rec8 

und so weiter.

Meine erste Idee war es, 4 Abfragen zusammenzuführen, die jeden fünften Datensatz beginnend mit 1,2,3,4 zurückgeben, aber ich bin mir nicht genau sicher ... Können Sie helfen?

+0

Das ist wie ein klingt Formatierungsproblem in Ihrer Sicht, kein SQL-Problem. Wenn Sie Ihre Datensätze anzeigen, warum schreiben Sie nicht eine Schleife, die prüft, ob der Datensatz, auf dem Sie sich befinden, durch 4 teilbar ist, und wenn ja, starten Sie eine neue "Zeile"? – Sean

+0

Mögliches Duplikat von [MySQL-Pivot-Zeile in dynamische Anzahl von Spalten] (http://stackoverflow.com/questions/12004603/mysql-pivot-row-into-dynamic-number-of-columns) – Shadow

Antwort

0

Sie können dies auf der id mit Arithmetik und group by:

select (case when id % 4 = 1 then id end) as id1, 
     (case when id % 4 = 1 then name end) as name1, 
     (case when id % 4 = 1 then age end) as age1, 
     (case when id % 4 = 2 then id end) as id2, 
     (case when id % 4 = 2 then name end) as name2, 
     (case when id % 4 = 2 then age end) as age2, 
     (case when id % 4 = 3 then id end) as id3, 
     (case when id % 4 = 3 then name end) as name3, 
     (case when id % 4 = 3 then age end) as age3, 
     (case when id % 4 = 0 then id end) as id4, 
     (case when id % 4 = 0 then name end) as name4, 
     (case when id % 4 = 0 then age end) as age4 
from t 
group by floor((id - 1)/4); 

Wenn die id nicht ohne Lücken nicht erhöhen, dann können Sie eine Verwendung generieren:

from (select t.*, (@rn := @rn + 1) as seqnum 
     from t cross join 
      (select @rn := 0) params 
     order by id 
    ) t 
Verwandte Themen