SQL - Abfrage - Alle Daten in einer Column

Kazume

Benutzer
Beiträge
15
Hallo Leute,

ich hab einige Probleme mit einer Datenbank.

In der Tabelle "WSD" stehen in einer Column alle Daten untereinander weg.
Nennen wir die Column mal "Data"

Nachname
EMail
Vorname
Adresse
Land
Geburtsdatum
Stadt
Plz

In der Column "CID" stehen die Zugehörigkeiten

1
3
4
5
7
8
11
13

Jetzt würde ich gerne eine SQL Abfrage machen, sodass die Daten nebeneinander stehen.
Vorname, Nachname, E-Mail und so weiter

Bisher hatte ich versucht mit Joins zu arbeiten (Da hatte ich allerdings keinerlei Erfolg irgendwas anzeigen zu lassen)

Ansonsten bisher mit Case

Case
When wsd.cid = '3' Then wsd.`data`
Else '' END AS 'E-Mail',

Case
When wsd.cid = '1' Then wsd.`data`
Else '' END AS 'Nachname',

Case
When wsd.cid = '4' Then wsd.`data`
Else '' END AS 'Vorname'

Jetzt stehen die Daten zwar nebeneinander, allerdings mit Leeren Zeilen und natürlich nicht sotiert nebeneinander.


Ich weiß absolut nicht wie ich das Lösen könnte bzw die Logik dahinter.
Liegt es vielleicht am Donnerstagmorgen?

Ich hoffe es kann mir jemand behilflich sein.
LG
 
Werbung:
Du nimmst den Fremdschlüssel den die Tabelle vermutlich auf eine andere Tabelle hat und joinst dann alles dazu:
Code:
SELECT h.*,w1.Data AS Nachname,w3.Data AS EMail FROM haupttabelle h
LEFT JOIN wsd w1 ON h.primary_key = w1.foreign_key AND w1.CID = 1
LEFT JOIN wsd w3 ON h.primary_key = w3.foreign_key AND w3.CID = 3
[...]
 
Dank für die schnelle Antwort ukulele :)

Ich bin mir nicht sicher ob ich das so richtig angewendetet habe.

SELECT
w1.`data` AS Nachname
w3.`data` AS EMail
FROM webform_submitted_data wsd
LEFT JOIN webform_submitted_data w1 ON wsd.nid = w1.nid AND w1.CID = 1
LEFT JOIN webform_submitted_data w3 ON wsd.nid = w3.nid AND w3.CID = 3
Where
wsd.nid = '21657'

Nach gut 20 Minuten gibt es leider kein Ergebnis aus, ich denke mal die läuft ins leere?

Hier ein kleiner Auschnitt aus der Datenbank

 
Also ohne "Haupttabelle" könnte man sich so behelfen:
Code:
SELECT
w1.`data` AS Nachname
w3.`data` AS EMail
FROM ( SELECT DISTINCT nid FROM webform_submitted_data ) wsd
LEFT JOIN webform_submitted_data w1 ON wsd.nid = w1.nid AND w1.CID = 1
LEFT JOIN webform_submitted_data w3 ON wsd.nid = w3.nid AND w3.CID = 3
Where
wsd.nid = '21657'
...und das sollte dann auch laufen.
 
Da ich meinen Beitrag leider nicht editieren kann:

Edit: Bin von HeidiSQL mal auf die MySQL Workbench umgestiegen.

Per Workbench funktioniert die Abfrage, allerdings mit einem Fehler.

Code:
SELECT
w1.`data` AS Nachname,
w3.`data` AS EMail
FROM webform_submitted_data wsd
LEFT JOIN webform_submitted_data w1 ON wsd.nid = w1.nid AND w1.CID = 1
LEFT JOIN webform_submitted_data w3 ON wsd.nid = w3.nid AND w3.CID = 3
Where
wsd.nid = '21657'

Bei der Spalte "Nachname" ist der selbe Nachname in jeder Spalte.
Bei der EMail Adresse scheint es zu funktionieren.

Füge ich einen weiteren Join dazu ist der letzte Join derjenige der funktioniert.
Sitzen jetzt mittlerweile mit 2 Personen an der Abfrage. - Wir sind dumm! :)
 
Bei der Spalte "Nachname" ist der selbe Nachname in jeder Spalte.
Klingt wie ein Cross Join der dann auch die Laufzeit verursacht. Ich kann nur absolut nicht ausmachen wo hier der Fehler sein soll, sicher das die gezeigten Daten richtig sind? Im Bild wird nid 15380 gezeigt, in der Abfrage steht 21657.
 
Habt ihr den FROM-Teil überhaupt angepasst (siehe Post #4) oder einfach auf alle Datensätze alles gejoint? Wieviele Datensätze sind in der Tabelle?
 
Die Tabelle hat circa 9 Millionen Einträge.

Der Query aus Post #4 lieferte das Ergebis:

Spalte Nachname: Spalte EMail:

Müller Müller@web.de
Müller Rolf@gmx.de
Müller Claudia@yahoo.de
Müller Max@gmail.de
Müller Mustermann@gmail.de
Müller Name@mail.de
Müller Whisky@irish.de


Zu dem Thema "Laufzeiten" kann man HeidiSQL das Problem zuschieben, mit MySQL Workbench dauert es keine 10 Sekunden.

Nochmal zur Erklärung wo welche Daten stehen (ich denke daran wirds liegen)

Die Datenbank hat 12 Tabellen.
In der Tabelle "webform_submitted_data" gibt es wie im Screenshot zu sehen die "nid - sid - cid - no - data" Spalten.

Die NID ist die ID die für uns wichtig ist als Identifikations ID.
Die SID Spalte sowie die NO sind für unsere Informationen irrelevant.

In der Spalte CID stehen z.B. die Zahlen 1, 3, 4, 5, 7, 8, 11, 13 die in der Spalte Data den Namen,Vornamen,Land,Geburtsdatum wiederspiegeln.

CID 1 ist gleich Data Nachname


Ich hoffe ich verwirre hier niemanden.
 
Ich hoffe ich verwirre hier niemanden.

Geht so.

Du hast:

Code:
test=*# select * from kazume ;
 sid | cid |  data   
-----+-----+----------
  48 |  1 | nachname
  48 |  3 | email
  48 |  4 | vorname
  48 |  5 | adresse
  48 |  7 | land
(5 Zeilen)

Mal vereinfacht, aber sollte das sein, was Du hast.

Du hast bisher versucht / erhalten (gekürzt auf 2 Spalten):

Code:
test=*# select sid, case when cid=1 then data end as nachname, case when cid=3 then data end as email from kazume ;
 sid | nachname | email
-----+----------+-------
  48 | nachname |
  48 |  | email
  48 |  |
  48 |  |
  48 |  |
(5 Zeilen)

Sieht nicht nur Scheiße aus - ist es auch.

Code:
test=*# select sid, string_agg(case when cid=1 then data end, '') as nachname, string_agg(case when cid=3 then data end, '') as email from kazume group by sid;
 sid | nachname | email
-----+----------+-------
  48 | nachname | email
(1 Zeile)

test=*#

scheint das zu sein, was Du suchst. MySQL hat kein string_agg(), aber etwas vergleichbares. Das zu finden überlasse ich Dir zur Übung.

Performance: Du hast mit MySQL keine gute Wahl getroffen, mit aktuellen PostgreSQL-Versionen könntest Du von paralleler Ausführung von Aggregationen profitieren...
 
Werbung:
Mit group_concat funktioniert es wunderbar.
Vielen herzlichen Dank dafür!

Die Datenbank wurde nicht von mir eingerichtet, sondern von einem IT-Dienstleister der die Webseite betreut und Entwicklungen tätigt.
Ich kenne mich nicht gerade mit Datenbanken aus - es reichte bisher allerdings aus.

Wir sind auch vom Stuhl gefallen als wir die Datenbank gesehen haben.
 
Zurück
Oben