delirium: Meherer JOINS und doppelte Ergebnisse bei GROUP_CONCAT

Hallo,

ich habe drei Tabellen:

1. airports - Spalten: id, name
2. frequencies - Spalten: id, airport, name, frequency
3. runways - Spalten: id, airport, length

Zu jedem "airports"-Datensatz gibt es beliebig viele Datensätze in "frequencies" bzw. "runways".

Alle Datensätze der Tabellen "frequencies" und "runways" sollen in einer Ergebnis-Zeile stehen:
z.B.: München Erding  - Freq: TWR: 120.500; ATIS: 123.120; TWR: 118.700 -  Runways: 4000m; 4000m

Die Abfrage

  
SELECT  
  a.*,  
  GROUP_CONCAT(f.`name`, ': ', f.`frequency` SEPARATOR '; ') AS frequency  
FROM airports AS a  
LEFT OUTER JOIN frequencies AS f ON a.`id` = f.`airport`  
GROUP BY a.`name`  

führt zum gewünschten Ergebnis. Allerdings fehlt hierbei noch die Tabelle "runways". Wenn ich diese jetzt mit einem weiteren Join anhänge:

  
SELECT  
  a.*,  
  GROUP_CONCAT(f.`name`, ': ', f.`frequency` SEPARATOR '; ') AS frequency  
  GROUP_CONCAT(r.`length` SEPARATOR '; ') AS frequency  
FROM airports AS a  
LEFT OUTER JOIN frequencies AS f ON a.`id` = f.`airport`  
LEFT OUTER JOIN runways AS r ON a.`id` = r.`airport`  
GROUP BY a.`name`  

sind alle Einträge der "frequencies"-Tabelle doppelt vorhanden, was natürlich nicht gewünscht ist.

Kann mir jemand helfen?

Vielen Danke,
delirium

  1. Nachtrag: Es handelt sich um eine MySQL-Datenbank.

    1. Nachtrag: Es handelt sich um eine MySQL-Datenbank.

      Schreib einfach mal DISTINCT vor die Felder die Du zurückbekommen magst. Das sollte schon das gewünschte Ergebnis liefern.

      1. Schreib einfach mal DISTINCT vor die Felder die Du zurückbekommen magst.

        Wow, so einfach :) - Vielen Dank - Wünsche Dir noch einen schönen Abend.

        1. und wieder einer, den mysql auf den gewissen hat, weil er dachte seine abfrage funktioniert......

          Ilja

          1. und wieder einer, den mysql auf den gewissen hat, weil er dachte seine abfrage funktioniert......

            Ilja

            Sorry, versteh' nicht ganz (is' wohl zu spät). Was willst Du mir damit sagen?

            1. yo,

              Sorry, versteh' nicht ganz (is' wohl zu spät). Was willst Du mir damit sagen?

              SELECT a.*, ....
              FROM airports AS a
              ....
              GROUP BY a.name
              ;

              jedes andere dbms würde dir bei dieser anweisung eine fehlermeldung ausgeben. bei einer gruppierung können nur die spalten in der projektion ausgegeben werden, über die auch gruppiert wurde, es sei den, sie sind in einer aggregat-funktion eingebunden. nur mysql bestreitet dort aus performancegründen andere wege, was aber zu mehr verwirrung führt, als es hilfreich ist und gibt dir deswegen keine fehlermeldung aus. zum einen fragt sich, ob der name in der tabelle airports überhaupt eindeutik sein muss, zum anderen solltest du die id mit in die gruppierung nehmen, wenn du sie auch ausgeben willst.

              zusätzlich würde ich untersuchen, ob die OUTER JOINS notwendig sind, oder ob man daraus nicht INNER JOINS machen kann. eventuell würde ich sogar gar keinen JOIN benutzen, sondern Unterabfragen verwenden.

              Ilja

              1. Danke.

                jedes andere dbms würde dir bei dieser anweisung eine fehlermeldung ausgeben. bei einer gruppierung können nur die spalten in der projektion ausgegeben werden, über die auch gruppiert wurde, es sei den, sie sind in einer aggregat-funktion eingebunden. nur mysql bestreitet dort aus performancegründen andere wege, was aber zu mehr verwirrung führt, als es hilfreich ist und gibt dir deswegen keine fehlermeldung aus. zum einen fragt sich, ob der name in der tabelle airports überhaupt eindeutik sein muss, zum anderen solltest du die id mit in die gruppierung nehmen, wenn du sie auch ausgeben willst.

                Also so?:
                [code=sql]
                SELECT a.name, a.icao (...)
                FROM airports AS a
                (...)
                GROUP BY a.name, a.icao
                ;
                [/code]

                zusätzlich würde ich untersuchen, ob die OUTER JOINS notwendig sind, oder ob man daraus nicht INNER JOINS machen kann. eventuell würde ich sogar gar keinen JOIN benutzen, sondern Unterabfragen verwenden.

                Danke für den Tipp. Werd's mir mal anschauen.

                1. yo,

                  Also so?:

                  SELECT a.name, a.icao (...)
                  FROM airports AS a
                  (...)
                  GROUP BY a.name, a.icao
                  ;

                    
                  das erste, was du dir überlegen musst ist, ob der name des airports eindeutig ist. wenn er das nämlich nicht ist, dann würdest du eventuell airports mit gleichen namen zusammen fassen (den namen mit einem UNIQUE contraint absichern). ist er nicht eindeutig, dann die id des airports mit in die gruppierung reinnehmen.  
                    
                  aber grnusätzlich ist vorsicht geboten, man kann nicht einfach alle spalten in die grupperierung mit reinnehmen, da sich damit auch das verhalten der gruppierung verändern kann. man muss sich also immer sehr gut überlegen, wonach man gruppieren will.  
                    
                  Ilja
                  
                  1. Sorry, dass ich dich weiter "belästige". Ich blicke gerade nicht ganz durch. In meiner airports-Tabelle ist die id der Primary-Key, icao ist nicht unique, weil es auch mehrere Einträge mit leeren Werten gibt.

                    Wie müsste die Abfrage jetzt genau aussehen, wenn ich die durch die Joins entstehenden doppelten Eintrage vermeiden möchte?
                    GROUP BY a.id genügt ja nicht, oder (obwohl es bei mir zum gewünschten Ergebnis führt [hätte es aber trotzdem gerne korrekt])?

                    Möchte mich für deine Hilfe nochmals Bedanken.