2017-02-05 4 views
0

Ich bin komplett neu in mysql. Hier versuche ich eine Abfrage in mysql, die eine Spalte col1 in 4 verschiedenen Spalten basierend auf seiner Kategorie (col2) in sortierter Reihenfolge wie unten dargestellt.Teilen Sie die Spalten in MySQL in mehrere Spalten

select if(category = 'first',name ,NULL) as first, 
if(category = 'second',name,NULL) as second, 
if(category = 'third',name,NULL) as third, 
if(category = 'fourth',name,NULL) as fourth 
from 'table'; 

dieser Code gibt mir die vier Spalten, aber ich bin jetzt stecken, da ich nicht in der Lage bin weiter diese zu filtern: Ich habe eine Abfrage wie diese bis jetzt geschrieben.

Gegeben Tabelle:

name  category 
John  first 
Sunil third 
Jenny third 
Ashley fourth 
Meera second 
Abhay first 

Erforderliche Antwort:

col1 col2 col3 col4 
Abhay Meera Jenny Ashley 
John NULL Sunil NULL 

Beachten Sie, dass alle Spalten in der Antwort sortiert werden.

Edit: Ich denke, die Frage ist nicht klar über das Format der endgültigen Antwort. Danke @philipxy für das Aufzeigen. Die endgültige Antwort sollte in mindestens der Anzahl der Zeilen angepasst werden (in meinem Fall 2). Alle Spalten sollten die gleiche Anzahl von Zeilen haben, und wenn eine Spalte kleinere Werte hat, dann wird diese Zeile NULL Wert in entsprechenden Spalten haben, z. B. col2 und col 4 oben. Schließlich sollten alle Spalten in sortierter Reihenfolge sein, wobei NULL in der letzten (falls vorhanden) ist. Angenommen, es gab einen Eintrag mit der Bezeichnung Olly mit categoryfourth dann sollte es vor NULL in col4 und nach Ashley erscheinen.

+0

ist die erforderliche Ausgabe angenommen, dass nur 2 Zeilen haben? oder könnte es mehr geben, abhängig von der Anzahl der Zeilen in der Originaltabelle? – Yousaf

+0

Es kann mehr Zeilen geben. Ich habe hier nur ein Beispiel gezeigt. –

+0

Warum versuchen Sie das zu tun? Dies zwingt Werte in die Zeilen einer Tabelle, als wäre es ein GUI-Gitter. Sie sollten wahrscheinlich nicht in einer SQL-Tabelle formatieren, sollten Sie in einer GUI formatieren. Bedenkt, dass Sie nicht wissen, was "select t. *" Bedeutet. Sie sind fast sicher, wollen nicht das Ergebnis, das Sie verlangen. – philipxy

Antwort

1

Dies ist schwierig. Sie versuchen, Listen vertikal statt horizontal zu stapeln, was keine "normale" SQL-Operation ist.

Mit der bedingten Aggregation können Sie das tun, was Sie wollen. Das Problem ist, dass es nichts zu aggregieren gibt. Die Lösung ist eine variable Säule einzuführen, um eine Sequenznummer für die Aggregation zu berechnen:

select max(case when category = 'first' then name end) as first, 
     max(case when category = 'second' then name end) as second, 
     max(case when category = 'third' then name end) as third, 
     max(case when category = 'fourth' then name end) as fourth 
from (select t.*, 
      (@rn := if(@c = category, @rn + 1, 
         if(@c := category, 1, 1) 
         ) 
      ) as rn 
     from `table` t cross join 
      (select @c := '', @rn := 0) params 
     order by category 
    ) t 
group by rn; 

Wenn Sie die Werte in einer bestimmten Reihenfolge in jeder Spalte möchten, dann einen zweiten Sortierschlüssel nach category hinzufügen.

EDIT:

ich darauf hingewiesen, dass, wenn Sie nicht mehrere Zeilen brauchen, sondern nur die Werte, können Sie sie zusammen verketten:

select group_concat(case when category = 'first' then name end) as firsts, 
     group_concat(case when category = 'second' then name end) as seconds, 
     group_concat(case when category = 'third' then name end) as thirds, 
     group_concat(case when category = 'fourth' then name end) as fourths 
from`table` t 
group by rn; 
+0

Können Sie mir bitte die Logik erklären, für die die Variablen in Ihrem Code verwendet werden und ich verstehe diesen Teil auch nicht: 'Wählen Sie t. *' Was ist 't. *'? –

+0

@SunilKumar. . 't' ist ein Tabellenalias. In der Dokumentation erfahren Sie mehr über benutzerdefinierte Variablen (https://dev.mysql.com/doc/refman/5.7/en/user-variables.html). Führen Sie die Unterabfrage selbst aus, wenn Sie sehen möchten, wie sie für diese Abfrage funktioniert. –

+0

Bitte geben Sie einen Verweis auf MySQL (oder * alle * SQL DBMS) Spezifikationen, die Zuordnung zu einer Variablen in einem SELECT mit einem FROM als eine Variable Zuordnung für jede Zeile, in ORDER BY Reihenfolge, mit Subselects vor dem Ausdruck enthält? Ihre Behauptung, dass diese Antwort eine Lösung für die Frage ist, beruht darauf, aber obwohl es in der verknüpften Dokumentation kryptische suggestive Phrasen gibt, ist diese Semantik nirgends dokumentiert. – philipxy

0

Versuchen Sie, diese

select if(category = 'first',name ,NULL) as first, 
if(category = 'second',name,NULL) as second, 
if(category = 'third',name,NULL) as third, 
if(category = 'fourth',name,NULL) as fourth 
from table1 ORDER BY name; 

Ausgabe

| first | second | third | fourth | 
|--------|--------|--------|--------| 
| Abhay | (null) | (null) | (null) | 
| (null) | (null) | (null) | Ashley | 
| (null) | (null) | Jenny | (null) | 
| John | (null) | (null) | (null) | 
| (null) | Meera | (null) | (null) | 
| (null) | (null) | Sunil | (null) | 
+0

Ich habe bis zu diesem Teil getan. Eigentlich muss ich nur im angegebenen Format antworten. –

+0

nach gegebenem Format, meinst du nur 2 Zeilen? – Yousaf

+0

bedeutet, dass Sie die Spalten so anpassen müssen, dass Nullwerte so oft wie möglich vorkommen und sie nach allen Namen (in sortierter Reihenfolge) auftreten sollten. –