Linuchs: mySQL: Mehrere JOINS in einem Treffer zusammenfassen (gelöst)

Moin,

eine Veranstaltung kann mehrere Typen haben, z.B. „Senioren“ und „Musik“.

Die Tabelle termin_typ (n:n) hat pro Kombination termin_id / typ_id einen Eintrag. Im genannten Fall also zwei Einträge.

Wenn ich nun Termine lese und die Typen mit LEFT JOIN dazuhole, habe ich denselben Termin zweimal als Treffer.

Können mehrere typ_id auch in einem Feld stehen, etwa getrennt durch Komma?

Im Moment habe ich keine Idee, auch ein Sub-Select, der n Treffer hat, lässt sich nicht in einem Feld darstellen. Fehlermeldung:

„1242: Subquery returns more than 1 row“

Ein GROUP BY auf den termin_id, der alle Groupies sammelt? Mir auch nicht bekannt.

Linuchs

Edit: GROUP_CONCAT ist mein Freund.

  1. „1242: Subquery returns more than 1 row“

    Würde auch mir zu erst einfallen: Subquery mit GROUP BY termin_id oder LIMIT 1.

  2. Hallo Linuchs,

    solange Du nur die Typ-IDs brauchst, geht das ja noch. Wenn Du aber Typ-IDs und Typ-Namen haben willst (also das andere Ende der m:n Beziehung), wird es knifflig. Du kannst natürlich immer noch einen Group-Concat machen und etwas in der Art "7:täglich;1:wöchentlich;19:einmalig" generieren (oder was auch immer deine Termintypen besagen, ist ja wurscht für die Technik), aber dann wird es schon knifflig. Solang es nur eine ID ist - also eine Spalte -, bist Du im PHP mit einem EXPLODE fertig. Aber wenn es zwei Spalten werden brauchst Du eine aufwändige Nachbearbeitung.

    Da kann dann doch ein regulärer LEFT JOIN mit einer Gruppenwechsel-Verarbeitung beim Einlesen des Ergebnisses sinnvoller sein.

    Rolf

    --
    sumpsi - posui - obstruxi
  3. Folgeproblem:

    ich möchte nicht die Typen, sondern die übergeordneten Typ-Gruppen.

    Der erste LEFT JOIN gibt mir n typ_id zur Veranstaltung.

    Der zweite LEFT JOIN gibt mir genau 1 typ_gruppe pro typ_id

    Zwei Typen einer Veranstaltung z.B. „Fasching / Karneval“ und „Straßen-, Hafen-, Weinfest“.

    Antwort ist „Fest“ und nochmal „Fest“.

    Dokument mysql-distinct-on-a-group-concat diskutiert

    SELECT GROUP_CONCAT(DISTINCT categories SEPARATOR ' ')

    DISTINCT wirkt bei mir aber nicht.

    1. Hallo Linuchs,

      das ist MYSQL Spezialwissen, da müsste ich auch erstmal basteln.

      Tabelle Termine:

      termin_id
      ...

      Tabelle Termin-Typ:

      termin_id
      typ_id
      ...

      Tabelle Typen

      id
      typgruppe_id ...

      Tabelle Typgruppe

      id
      name

      Ist das in etwa dein DB Schema?

      Rolf

      --
      sumpsi - posui - obstruxi
    2. Hallo Linuchs,

      ok, mit diesem Schema ausprobiert. So wie Du es machst, scheint es richtig.

      select t.*
            , group_concat(distinct y.name separator ', ') as typen
            , group_concat(distinct g.name separator ', ') as typen
      from termin t
        left join termin_typ tt on tt.termin_id = t.id
        left join typ y on tt.typ_id = y.id
        left join gruppe g on y.gruppe_id = g.id
      group by t.id, t.name
      

      Rolf

      --
      sumpsi - posui - obstruxi