Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

SQL - Abfrage - Alle Daten in einer Column

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Kazume, 20 April 2017.

  1. Kazume

    Kazume Benutzer

    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
     
  2. ukulele

    ukulele Datenbank-Guru

    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
    [...]
    
     
    Kazume gefällt das.
  3. Kazume

    Kazume Benutzer

    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

    [​IMG]
     
  4. ukulele

    ukulele Datenbank-Guru

    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.
     
    Kazume gefällt das.
  5. Kazume

    Kazume Benutzer

    Leider tut es das nicht. Die Abfrage rattert jetzt 32 Minuten schon ohne Ergebnis :(
     
  6. Kazume

    Kazume Benutzer

    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! :)
     
  7. ukulele

    ukulele Datenbank-Guru

    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.
     
    Kazume gefällt das.
  8. Kazume

    Kazume Benutzer

    Das Bild zeigt nur die Daten der Tabelle
    Code:
    webform_submitted_data
    so wie diese da stehen, also ohne Abfrage.
     
  9. ukulele

    ukulele Datenbank-Guru

    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?
     
    Kazume gefällt das.
  10. Kazume

    Kazume Benutzer

    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.
     
  11. akretschmer

    akretschmer Datenbank-Guru

    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...
     
    Kazume gefällt das.
  12. Kazume

    Kazume Benutzer

    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.
     
    akretschmer gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden