Frage zu einem JOIN

Bicko

Erfahrenes Mitglied
MySQL 4.1.21: Frage zu einem JOIN über 3 Tab.

Hi,

Nun bin ich doch wieder hier gelandet mit einem neuen Problem an dem ich mich festgebissen habe. Leider habe ich an anderen Stellen des www keine Lösung gefunden und hoffe nun auf Eure Tips, bevor ich noch völlig verzweifle..

Ich habe 3 Tabellen aus denen ich verschiedene Daten rauslesen möchte.

tblMatchReports (Dort stehen Spielberichte drinn)
tblFixtures (Spielpläne mit Ergebnissen)
tblTeams (Mannschaften)

Es gibt 2 Möglichkeiten Matchreports zu schreiben, einmal direkt über die Seite der Spielpläne oder alternativ über ein extra Formular. Getrennt ist das Ganze, da ich auch die Möglichkeit geben möchte über Freundschaftspiele schreiben zu können, die nicht in der Liste der Ligaspiele (tblFixtures) aufgeführt sind.

Wenn ich über den Spielplan gehe wird in die tblMatchReports die FixtureID des jeweiligen Spiels eingetragen, beim späteren Auslesen wird dann als Titel die Mannschaften und das Ergebnis automatisch angezeigt.

Wenn ich nun alternativ meinen Matchreport schreibe, wird in der tblMatchReports natürlich keine FixtureID eingetragen, da es keine gibt. FixtureIDs gibt es nur bei Ligaspielen.

Nun möchte ich auf einer Seite alle Matchreports anzeigen, dafür habe ich ein JOIN zusammengebastelt.

PHP:
tblMatchReports.FixtureID,tblMatchReports.MatchReportID,tblMatchReports.MatchReportTitle,tblMatchReports.MatchReportText,
tblFixtures.HomeTeamID as HomeTeam,tblFixtures.GuestTeamID as GuestTeam,tblFixtures.MatchDate,
tblFixtures.HomeGoals, GuestGoals,
Heim.TeamName as HomeTeam, 
Gast.TeamName as GuestTeam 

FROM tblMatchReports 
INNER JOIN tblFixtures ON tblMatchReports.FixtureID=tblFixtures.FixtureID 
INNER JOIN tblTeams Gast  ON tblFixtures.HomeTeamID=Heim.TeamID 
INNER JOIN JOIN tblTeams Heim  ON tblFixtures.GuestTeamID=Gast.TeamID

Leider werden mir so nur die Matchreports, die eine FixtureID haben angezeigt. Ich möchte aber ja alle angezeigt bekommen und bei denen mit FixtureID noch die Informationen Manschaftsnamen und Ergebnis.

Habe das mal mit OUTER JOIN probiert, funktioniert aber nur wenn ich diesen Teil :
PHP:
INNER JOIN tblTeams Gast  ON tblFixtures.HomeTeamID=Heim.TeamID 
INNER JOIN JOIN tblTeams Heim  ON tblFixtures.GuestTeamID=Gast.TeamID

komplett weglasse. Wenn ich 3 OUTER nehme kommt eine Fehlermeldung:
Cross dependency found in OUTER JOIN; examine your ON conditions

Habe noch nie OUTER benutzt, bzw hatte auch noch die ein solches Problem zu lösen. In welcher Richtung müsste ich da für eine Lösung schauen. Habe schon ordentlich gegoogelt, sogar eine neue MySQL Version installiert, nicht das es daran liegt aber immer noch keine Lösung in Sicht.

Jemand einen Tip? Wäre wirklich dankbar dafür. Vielen Dank im Voraus.
 
Zuletzt bearbeitet:
ein outer-Join bewirkt, dass auch dann Sätze ausgegeben werden, wenn eine Join-Bedingung nicht zutrifft. Wenn man im gegebenen Beispiel die tblTeams mit der tblFixtures joint, bekommt man die Verknüpfung aller Sätze der beiden Tabellen, für die die Join-Bedingung erfüllt ist. Gäbe es auch Mannschaften, die niemals ein Spiel absolvieren (immerhin besteht die Gefahr einer Niederlage), dann bekäme man diese nur über einen outer Join, da die Join-Bedingung hier nicht zutreffen würde (=könnte).

Outer Joins sind oft eine etwas unübersichtliche Angelegenheit, besonders, wenn mehrere Tabellen verbunden werden. Manchmal hilft es, wenn man sie in Inline-Queries verpackt (also einen SQL-Befehl auf der Basis eines anderen Statements formuliert:

SELECT ...
FROM (SELECT ... FROM ... INNER JOIN ...) tabelle1 OUTER JOIN ... ON ...


Allerdings weiß ich nicht, ob mysql mit Inline-Queries klar kommt (wäre schade, wenn nicht - Inline-Queries sind wirklich sehr nett)

Gruß

M.
 
Hi,

erstmal danke für die Antwort. Also im Prinzip ist es ja so das ich
1. Alles aus tblMatchReports lesen möchte.
2. wenn es eine Fixture ID gibt, dann die Informationen aus tblFixtures lesen (dort gibt es eine HomeTeamID und GuestTeamID)
3. Diese tblFixtures dann mit der tblTeams verbinden um die Namen zu der HomeTeamID und GuestTeamID auszulesen.

Fakt ist das tblMatchReports immer ausgelsen werden soll, egal ob FixtureID vorhanden oder nicht und nach Bedarf halt die Zusatzinfos.

Ich drehe mich da im Kreis und bekomme einfach nicht das richtige Ergebnis.
 
was passiert, wenn man aus der ersten Bedingung einen Outer Join macht und die anderen als inner Join stehen lässt, also:

OUTER JOIN tblFixtures ON tblMatchReports.FixtureID=tblFixtures.FixtureID
INNER JOIN tblTeams Gast ON tblFixtures.HomeTeamID=Heim.TeamID
...


?
 
Also wenn ich das eintippe:

PHP:
 FROM tblMatchReports 
 LEFT OUTER JOIN tblFixtures ON tblMatchReports.FixtureID=tblFixtures.FixtureID 
 INNER JOIN tblTeams Gast  ON tblFixtures.HomeTeamID=Heim.TeamID 
 INNER JOIN tblTeams Heim  ON tblFixtures.GuestTeamID=Gast.TeamID

werden keine Datensätze angezeigt.
 
liefert die Query ohne die Outer Join-Klausel die gwünschten Ergebnisse für alle Sätze mit einer FixtureID?

Vielleicht wäre folgendes noch einen Versuch wert:

PHP:
FROM tblFixtures  
 RIGHT OUTER JOIN tblMatchReports ON tblMatchReports.FixtureID=tblFixtures.FixtureID 
 INNER JOIN tblTeams Gast  ON tblFixtures.HomeTeamID=Heim.TeamID 
 INNER JOIN tblTeams Heim  ON tblFixtures.GuestTeamID=Gast.TeamID
 
Moin,

erstmal vielen Dank für Deine Antworten, leider klappt aber auch das nicht. Also wenn ich

PHP:
RIGHT OUTER JOIN tblMatchReports ON tblMatchReports.FixtureID=tblFixtures.FixtureID  
INNER JOIN tblTeams Gast  ON tblFixtures.HomeTeamID=Heim.TeamID  
INNER JOIN tblTeams Heim  ON tblFixtures.GuestTeamID=Gast.TeamID

verwende zeigt er mir so viele Match Reports wie Einträge in der tblFixtures an, obwohl ich momentan ja nur 2 Einträge in der tblMatchReports habe. 1 Report mit FixtureID 1 ohne. Ich möchte also erreichen das mir 2 Reports angezeigt werden.

Bei LEFT OUTER 1 Report (der mit der FixtureID)
Bei RIGHT OUTER über 20
Bei INNER JOIN 1 Report (der mit der FixtureID)

oh man ist das schwierig. Hast Du noch eine Idee? Es muss doch eine Lösung geben...
 
Alles nur eine Frage der Klammerung :)

SQL:
SELECT r.FixtureID,r.MatchReportID,r.MatchReportTitle,r.MatchReportText,
f.HomeTeamID as HomeTeam,f.GuestTeamID as GuestTeam, f.MatchDate
f.HomeGoals, f.GuestGoals,
Heim.TeamName as HomeTeam,
Gast.TeamName as GuestTeam

FROM tblMatchReports r LEFT JOIN
     (tblFixtures f 
      INNER JOIN tblTeams Gast ON f.HomeTeamID=Gast.TeamID 
      INNER JOIN tblTeams Heim ON f.GuestTeamID=Heim.TeamID)
  ON r.FixtureID = f.FixtureID;
 
Hi zeja,

danke für Deinen Ansatz. Ein interessanter Effekt. Ich bekomme damit alle Matchreports angezeigt, aber zusätzlich werden alle Matchreports mit allen Einträgen der tblFixtures verbunden. Sieht also so aus:

1. Eintrag hat FixtureID
Titel: TeamA -TeamB 10:0
Text: Spielbericht

2. Eintrag ohne FixtureID
Titel: leer - TeamB 10:0
Text: Alternativeintrag

3. Eintrag
Titel: leer-TeamC 1:0
Text: Spielbericht von Eintrag 1

4. Eintrag
Titel: leer-TeamC 1:0
Text: Spielbericht von Eintrag 2 also Alternativeintrag

und immer so weiter im Wechsel. Ziemlich abgefahren. Eine Idee was da falsch sein könnte?
 
Gibt mir mal bitte deine Daten... kann das bei denen die ich so angelegt habe nicht herstellen. Bei mir funktioniert die Abfrage so ganz gut.

csv Export oder irgendwie sowas wäre toll. Kannst ja als Anhang hier dranpacken.
 

Neue Beiträge

Zurück