Guma: > MySQL > SELECT mit zweimal LEFT JOIN>

Hallo zusammen,

ich mache schon lange an dieser SELECT rum, da Sie nicht alle gewünschten Inhalte liefert wie ich mir das vorstelle.

Meine vier Tabellen:

TABELLE "hotel_firma":
------------------------
li_id
kundenummer
name
ort
last_edit

TABELLE "hotel_form":
------------------------
id
id_firma
email

TABELLE 1 "hotel_leistungen":
------------------------
id_firma
leistung

TABELLE "hotel_aktivitaeten":
------------------------
id_firma
aktivitaet

Jetzt die SELECT-Abfrage:
------------------------
SELECT distinct kundennummer,
GROUP_CONCAT(leistung) AS Leistungen,
GROUP_CONCAT(aktivitaet) AS theaktivitaet,
li_id,name,ort,email
FROM hotel_firma
INNER JOIN hotel_form
ON hotel_firma.li_id = hotel_form.id_firma
LEFT JOIN hotel_leistungen
ON hotel_firma.li_id = hotel_leistungen.id_firma
LEFT JOIN hotel_aktivitaeten
ON hotel_firma.li_id = hotel_aktivitaeten.id_firma
WHERE online=1
GROUP BY  kundennummer
ORDER BY last_edit DESC

Hier meine Frage:
ICh will die Tabelle mit allen Inhalten ausgeben. So werden derzeit alle Leistungen aus hotel_leistungen in ein Feld geschrieben, die zugehörigen Tabellenfelder werden auch ausgegeben. was nicht ausgegeben wird sie die passenden Tabellenfelder von hotel_aktivitaeten. Hier sollen wie bei hotel_leistungen die Inhalte bei übereinstimmen des Primärschlüssels id_firma und li_id ausgegeben werden. Das tut es nicht. Was mache ich verkehrt?

Wird LEFT JOIN bei hotel_aktivitaeten nicht berücksichtigt? Geht denn überhaupt Left join zweimal in einem Select?

Grüße von Guma

  1. Hallo,

    Jetzt die SELECT-Abfrage:

    SELECT distinct kundennummer,
    GROUP_CONCAT(leistung) AS Leistungen,
    GROUP_CONCAT(aktivitaet) AS theaktivitaet,
    li_id,name,ort,email

    ^welche E-Mail erwartest Du hier? Oder gibt es je kundennummer nur eine? Warum dann eine eigene Tabelle? Zwar sind auch die Felder li_id, name und ort hier eigentlich falsch, weil sie weder zur Gruppierung noch in Aggregatfunktionen genutzt werden. MySQL akzeptiert das trotzdem und nimmt irgendeinen Wert aus der Gruppe über kundennummern. Nimmt man an, es gibt je kundennummer nur eine/n li_id, name bzw. ort, dann ergibt das noch einigermaßen Sinn. Bei der email aus hotel_form wird aber auch irgendein Wert aus der Gruppe über kundennummer genommen.

    FROM hotel_firma
    INNER JOIN hotel_form
    ON hotel_firma.li_id = hotel_form.id_firma
    LEFT JOIN hotel_leistungen
    ON hotel_firma.li_id = hotel_leistungen.id_firma
    LEFT JOIN hotel_aktivitaeten
    ON hotel_firma.li_id = hotel_aktivitaeten.id_firma
    WHERE online=1

    ^Was ist online?

    GROUP BY  kundennummer
    ORDER BY last_edit DESC

    Wird LEFT JOIN bei hotel_aktivitaeten nicht berücksichtigt? Geht denn überhaupt Left join zweimal in einem Select?

    Hast Du es mal mit Klammern versucht?

    ...
    FROM ((hotel_firma INNER JOIN hotel_form ON hotel_firma.li_id = hotel_form.id_firma)
    LEFT JOIN hotel_leistungen ON hotel_firma.li_id = hotel_leistungen.id_firma)
    LEFT JOIN hotel_aktivitaeten ON hotel_firma.li_id = hotel_aktivitaeten.id_firma
    ...

    viele Grüße

    Axel

    1. Danke Axel,

      Du schreibst:
      Zwar sind auch die Felder li_id, name und ort hier eigentlich falsch, weil sie weder zur Gruppierung noch in Aggregatfunktionen genutzt werden. MySQL akzeptiert das trotzdem und nimmt irgendeinen Wert aus der Gruppe über kundennummern. Nimmt man an, es gibt je kundennummer nur eine/n li_id, name bzw. ort, dann ergibt das noch einigermaßen Sinn.

      Ich antworte:
      Stimmt schon, es gibt jeweils nur eine/n li_id, name bzw. ort zur kundennnummer

      Du schreibst:

      Hast Du es mal mit Klammern versucht?

      Das werde ich gleich mal versuchen.
      Viele Grüße von Guma

  2. yo,

    mal davon angesehen, was dir axel gesagt hat und das ein DISTINCT grundsätzlich unnötig bei einem GROUP BY ist, wäre es gut zu wissen, welche mysql version (Unterabfragen erst ab 4.1) und was -> genau <- du angezeigt haben willst. je ausführlicher du dein problem erklärst, um so einfacher die antwort.

    Ilja

    1. Danke für die Antwort. meine mysql version ist 4.4,

      guma

      1. yo,

        meine mysql version ist 4.4,

        schon mal eine gute vorrausetzung. kannst du jetzt noch mal in worte fassen, was genau du als resultat haben willst (mit beispielen). aus deinem ersten beitrag ist mir dieser punkt noch nicht ganz klar.

        Ilja

      2. echo $begrüßung;

        meine mysql version ist 4.4,

        Das ist sie mit Sicherheit nicht, denn eine solche Versionsnummer wurde nie veröffentlicht.

        echo "$verabschiedung $name";