Forum Doku Wiki Blog

Forumsarchiv 2008, Mai
Meherer JOINS und doppelte Ergebnisse bei GROUP_CONCAT

archivierte Beiträge lesen

  1. (DATENBANK) Meherer JOINS und doppelte Ergebnisse bei GROUP_CONCAT von delirium, 15. 05. 2008, 19:39

Meherer JOINS und doppelte Ergebnisse bei GROUP_CONCAT

Der folgende Beitrag wurde am 15. 05. 2008, 19:39 Uhr von delirium veröffentlicht.

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

Meherer JOINS und doppelte Ergebnisse bei GROUP_CONCAT

Der folgende Beitrag wurde am 15. 05. 2008, 19:40 Uhr von delirium veröffentlicht.

Nachtrag: Es handelt sich um eine MySQL-Datenbank.

Meherer JOINS und doppelte Ergebnisse bei GROUP_CONCAT

Der folgende Beitrag wurde am 15. 05. 2008, 19:43 Uhr von Tobi veröffentlicht.

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

Meherer JOINS und doppelte Ergebnisse bei GROUP_CONCAT

Der folgende Beitrag wurde am 15. 05. 2008, 19:49 Uhr von delirium veröffentlicht.

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

Meherer JOINS und doppelte Ergebnisse bei GROUP_CONCAT

Der folgende Beitrag wurde am 15. 05. 2008, 20:14 Uhr von Ilja veröffentlicht.

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

Ilja

Meherer JOINS und doppelte Ergebnisse bei GROUP_CONCAT

Der folgende Beitrag wurde am 16. 05. 2008, 00:59 Uhr von delirium veröffentlicht.

> 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?

Meherer JOINS und doppelte Ergebnisse bei GROUP_CONCAT

Der folgende Beitrag wurde am 16. 05. 2008, 07:46 Uhr von Ilja veröffentlicht.

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

Meherer JOINS und doppelte Ergebnisse bei GROUP_CONCAT

Der folgende Beitrag wurde am 16. 05. 2008, 12:19 Uhr von delirium veröffentlicht.

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?:

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


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

Meherer JOINS und doppelte Ergebnisse bei GROUP_CONCAT

Der folgende Beitrag wurde am 16. 05. 2008, 13:22 Uhr von Ilja veröffentlicht.

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

Meherer JOINS und doppelte Ergebnisse bei GROUP_CONCAT

Der folgende Beitrag wurde am 16. 05. 2008, 14:01 Uhr von delirium veröffentlicht.

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.

© 1998-2013 SELFHTMLImpressumSoftware: Classic Forum 3.4