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

Fehler bei Group_Concat

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von papst, 22 Mai 2013.

  1. papst

    papst Neuer Benutzer

    Hey leute
    Ich habe folgendes problemchen:
    ich frage mit der Abfrage
    Code:
    SELECT perID, perVorname,
    GROUP_CONCAT(telNummer ORDER BY telNummer DESC SEPARATOR ', ') AS Telefonnummern,
    GROUP_CONCAT(emlAdresse ORDER BY emlAdresse DESC SEPARATOR ', ') AS EMailadrssen,
    perSchwimmer, perGeschlecht FROM tblPersonen INNER JOIN ( tblStati INNER JOIN (
    tblVeranstaltungen INNER JOIN tblTeilnahmen ON frzID = tnmfrzsemIDRef ) ON staID =
    tnmstaIDRef ) ON perID = tnmperIDRef  LEFT JOIN tblEmail ON (emlperIDRef = perID) LEFT JOIN
    tblTelefon ON (telperIDRef = perID) GROUP BY perID, perVorname, staName, frzID HAVING (
    ((staName) = 'Teilnehmer') AND ( (frzID) ='10') )
    die Kontakt informationen von personen ab.
    Dabei habe ich sowohl für email als auch für telefon eine eigene Tabellen.
    Um bei mehrerer z.b. telefonnummern die hintereinander zu reihen verwende ich die Group_Concat function.
    wenn ich nun von beiden kontakt infos gleichviel habe macht das keine probleme
    habe ich allerdings z.b. 2 telefonnummern und nur eine email adresse wird mir die email adresse doppeltabgezeigt.

    ich vermutemal das es am JOIN bereich liegt, weiß aber nicht wie ich das beheben könnte

    lg papst
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Der Papst, soso, ...

    Dein Problem kann ich nachvollziehen:

    Code:
    test=*# select * from person ;
     id | name
    ----+-------
      1 | name1
      2 | name2
      3 | name3
    (3 rows)
    
    test=*# select * from mail ;
     p_id |  adr
    ------+-------
        1 | mail1
        1 | mail2
        1 | mail3
        2 | mail4
    (4 rows)
    
    test=*# select * from phone ;
     p_id | nummer
    ------+--------
        1 | phone1
        2 | phone2
        2 | phone3
    (3 rows)
    
    test=*# select person.name, array_to_string(array_agg(mail.adr),', ') as mail, array_to_string(array_agg(phone.nummer),', ') as phone from person left join mail on person.id=mail.p_id left join phone on person.id=phone.p_id group by person.name;
     name  |        mail         |         phone
    -------+---------------------+------------------------
     name1 | mail3, mail2, mail1 | phone1, phone1, phone1
     name2 | mail4, mail4        | phone2, phone3
     name3 |                     |
    (3 rows)
    
    und lösen:

    Code:
    test=*# select person.name, array_to_string(array_agg(distinct mail.adr),', ') as mail, array_to_string(array_agg(distinct phone.nummer),', ') as phone from person left join mail on person.id=mail.p_id left join phone on person.id=phone.p_id group by person.name;
     name  |        mail         |     phone
    -------+---------------------+----------------
     name1 | mail1, mail2, mail3 | phone1
     name2 | mail4               | phone2, phone3
     name3 |                     |
    (3 rows)
    
    Ist jetzt PostgreSQL, vielleicht geht das so auch in MySQL, probier es aus. Vielleicht hilft ja auch ein Gebet ;-)

    Andreas
     
  3. papst

    papst Neuer Benutzer

    Hey
    vielen dank für die schnelle hilfe
    also in mysql muss das dann so aussehen:
    Code:
    select person.name, GROUP_CONCAT(mail.adr ORDER BY mail.adr DESC SEPARATOR ', ') as mail, GROUP_CONCAT(phone.nummerORDER BY phone.nummer DESC SEPARATOR ', ') as phone from person left join mail on person.id=mail.p_id left join phone on person.id=phone.p_id group by person.name;
    lg papst

    ps: so neben bei: wie bekommt ihr eigentlich immer diese schönen tabellen hin?? selbst zeichnen tut ihr die doch bestimmt nicht :D:D
     
  4. ukulele

    ukulele Datenbank-Guru

    Ich denke mal dein SQL Client muss Textausgabe unterstützen.
     
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