illuminatus26 Geschrieben 7. Oktober 2005 Teilen Geschrieben 7. Oktober 2005 Hallo zusammen. Bin mir gerade ein Tipspiel am zusammenbasteln. Jetzt bin ich an dem Punkt angelangt, wo ich mit Hilfe des Join-Befehl´s zwei Tabellen verbinden muss. Habe schon ein paar Sachen darüber gelesen und auch schon ein wenig rumprobiert. Trotzdem ist bei mir immer noch nicht so richtig der Groschen gefallen. Hat jemand von euch vielleicht eine einfach und vor allem verständliche Erklärung. Gehen wir mal davon aus, dass ihr es jemanden erklären müsst der überhaupt nichts weiss. Vielleich in der Art: Nimm Spalte name aus tabelle nutzer ...... Besten Dank Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
baba007 Geschrieben 7. Oktober 2005 Teilen Geschrieben 7. Oktober 2005 EInfach erklärt, wie ich finde Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Amstelchen Geschrieben 7. Oktober 2005 Teilen Geschrieben 7. Oktober 2005 vorweg: es gibt mehrere arten von joins, die sich hauptsächlich dadurch unterscheiden, dass sie unterschiedliche schnitte aus mengen (in dem fall datensätze) bilden. ein join verbindet für gleichartige arten von daten kriterien untereinander. am besten kann man das an folgendem beispiel - das ich kurzfristig "gebastelt" hab, sehen. tab. mitarbeiter mit_nr mitarbeitername abteilung 1 max mustermann 1 2 susi sorglos 1 3 sepp huber 2 tab. abteilung abt_nr abteilung 1 controlling 2 informationstechnologie mache ich jetzt einen inner join, werden all jene datensätze von beiden tabellen genommen, die in den verglichenen feldern übereinstimmen. SELECT mitarbeiter.mitarbeitername, abteilung.abteilung FROM abteilung INNER JOIN mitarbeiter ON abteilung.abt_nr = mitarbeiter.abteilung; das sieht im ergebnisset dann so aus. mitarbeitername abteilung max mustermann controlling susi sorglos controlling sepp huber informationstechnologie sprich: die abt_nr aus der tabelle abteilung wurde der abteilungsnummer aus der tabelle mitarbeiter gegenübergestellt. es gibt dann, je nach art des datenbanksystems, noch verschiedene andere arten von joins, die sich untereinander in der art der zurückgelieferten daten unterscheiden. HTH, s'Amstel Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
illuminatus26 Geschrieben 7. Oktober 2005 Autor Teilen Geschrieben 7. Oktober 2005 OK. Danke war ganz gut. Trotzdem funzt das bei mir immer noch nicht. Vielleicht mal ein Beispiel aus der Praxis. Habe eine Tabelle: tipspiel__mannschaften --id------verein------stadion --1------bayern-----allianz-- --15-----borussia----borusia-- 2. Tabelle: tipspiel__spiel --id---spieltagid---datumid--heimid--gastid--lfdnr---heimtor--gasttore-- --1-------1----------1--------1------15-----1-------3--------0------ So nun will ich mir die Spieltagsnummer und die Paarung anschauen. SELECT tipspiel__spiel.spieltagid, tipspiel__mannschaften.verein FROM tipspiel__spiel JOIN tipspiel__mannschaften JOIN tipspiel__mannschaften ON ( tipspiel__spiel.heimid = tipspiel__mannschaften.id ) ON ( tipspiel__spiel.gastid = tipspiel__mannschaften.id ) Erhalte folgende Fehlermeldung: #1066 - Not unique table/alias: 'tipspiel__mannschaften' Versteh das nicht. Mache ich es mit nur einem JOIN klappt es. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Monty82 Geschrieben 7. Oktober 2005 Teilen Geschrieben 7. Oktober 2005 Welches DBMS? SELECT tipspiel__spiel.spieltagid, tipspiel__mannschaften.verein FROM tipspiel__spiel JOIN tipspiel__mannschaften ON ( tipspiel__spiel.heimid = tipspiel__mannschaften.id ) JOIN tipspiel__mannschaften ON ( tipspiel__spiel.gastid = tipspiel__mannschaften.id ) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
illuminatus26 Geschrieben 7. Oktober 2005 Autor Teilen Geschrieben 7. Oktober 2005 Sorry. mysql 4.0.26 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Monty82 Geschrieben 7. Oktober 2005 Teilen Geschrieben 7. Oktober 2005 Ja, funktioniert mein Code aus dem vorherigen Post? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
illuminatus26 Geschrieben 7. Oktober 2005 Autor Teilen Geschrieben 7. Oktober 2005 Nee, leider nicht kommt der selbe Fehler wie bei meiner Abfrage. #1066 - Not unique table/alias: 'tipspiel__mannschaften' Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Monty82 Geschrieben 7. Oktober 2005 Teilen Geschrieben 7. Oktober 2005 Achso, ich solle besser lesen SELECT tipspiel__spiel.spieltagid, m1.verein FROM tipspiel__spiel JOIN tipspiel__mannschaften AS m1 ON ( tipspiel__spiel.heimid = m1.id ) JOIN tipspiel__mannschaften AS m2 ON ( tipspiel__spiel.gastid = m2.id ) Edit: Erklärung: MySQL wusste beim SELECT nicht, aus welcher Tabelle 'tipspiel__mannschaften' er den Vereinsnamen nehmen sollte, weil sie mehrfach eingebunden ist.... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
illuminatus26 Geschrieben 7. Oktober 2005 Autor Teilen Geschrieben 7. Oktober 2005 verstehe ich nicht so ganz. Also ich sage mySQL nimm aus Tabelle tipspiel__spiel Spalte spieltagid und aus Tabelle m1(woher wird dann gewusst das tabelle tipspiel__mannschaften gemeint ist??) Spalte verein. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Monty82 Geschrieben 7. Oktober 2005 Teilen Geschrieben 7. Oktober 2005 Weil ich der Tabelle mit "AS m1" einen Alias gegeben habe. Und damit Du direkt beide Vereine auslesen kannst, hängst Du noch ",m2.verein" in der Feldliste hinter SELECT dran... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
illuminatus26 Geschrieben 7. Oktober 2005 Autor Teilen Geschrieben 7. Oktober 2005 Schon klar soweit. Ich verstehe nur nicht ganz woher weiss mySQL denn dann, dass es sich um die Tabelle tipspiel__mannschaften handelt?? Ich muss doch vorher auch expliziet angeben das es tabelle tipspiel__spiel, Spalte spieltagid sein muss. Obwohl das doch auch in FROM tipspiel__spiel steht. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schlati Geschrieben 10. Oktober 2005 Teilen Geschrieben 10. Oktober 2005 Vorab: Abfragen werden nicht von "oben nach unten" ausgeführt. Das geht "kreuz und quer" (zumindest mag man diesen Eindruck bekommen), aber genau deswegen kann man die Aliase, die erst recht weit "unten" überhaupt zugewiesen werden (hier "M1" und "M2"), schon ganz "oben" verwenden. Ich verstehe nur nicht ganz woher weiss mySQL denn dann, dass es sich um die Tabelle tipspiel__mannschaften handelt?? Weil der Tabelle tipspiel__mannschaften die beiden Aliase "m1" bzw. "m2" zugewiesen worden sind. Ich muss doch vorher auch expliziet angeben das es tabelle tipspiel__spiel, Spalte spieltagid sein muss. Obwohl das doch auch in FROM tipspiel__spiel steht.Ne, du musst nicht explizit angeben, dass er die Spalte "spieltagid" aus der Tabelle tipspiel__spiel nehmen muss. Begründung: MySql geht bei einer Abfrage vereinfacht gesagt folgendermaßen vor: 1. Nehme alle Tabellen, die im "FROM" aufgeführt sind und merke dir schon mal alle Spaltennamen. 2. Verknüpfe die Tabellen so, wie die JOIN-Klausel (bzw. WHERE-Bedingung) es vorgibt. 3. Lies dann die Spalten aus der in 2 erstellten Tabelle aus, die in dem "SELECT" stehen. -> Für die Spalte "spieltagid" musst du nicht angeben, woher er die lesen soll, weil die Spalte nur 1 x (!) existiert. Existieren mehrere gleichnamige Spalten in verschiedenen Tabellen, müsstest du es angeben. Noch kurz zurück zum zuerst geposteten Code von Monty: SELECT tipspiel__spiel.spieltagid, tipspiel__mannschaften.verein FROM tipspiel__spiel JOIN tipspiel__mannschaften ON ( tipspiel__spiel.heimid = tipspiel__mannschaften.id ) JOIN tipspiel__mannschaften ON ( tipspiel__spiel.gastid = tipspiel__mannschaften.id ) ergibt Fehler -> #1066 - Not unique table/alias: 'tipspiel__mannschaften' Du joinst in dieser Abfrage 2x die Tabelle tipspiel__mannschaften, ohne eindeutige Namen zuzuweisen, was Monty im 2. Code ja durch "M1" und "M2" bewerkstelligt hat, weil die DB offensichtlich die Unterscheidung zwischen den beiden (für die DB gleichen) Tabellen nicht hinbekam. Nochmal in wenigen Worten: - im SELECT-Statement musst du bei der Abfrage einer Spalte nur den Tabellennamen angeben, wenn die abzufragende Spalte mehrmals existiert - bei mehrfachen JOIN auf gleiche Tabellen sollten Aliase zugewiesen werden, weil die DB die gleichen Tabellen nicht voneinander unterscheiden kann Schließlich würdest du ja auch einen beliebigen Apfel nehmen, wenn vor dir 2 Äpfel lägen und ich dir sagen würde "Nimm den Apfel". Daraufhin würdest du mich z.B. fragen "den grünen oder den roten", was ich dir vielleicht beantworten würde Diese "Intelligenz" besitzt eine DB nicht (wen soll sie denn schon fragen?) und läuft damit ins Leere. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
illuminatus26 Geschrieben 10. Oktober 2005 Autor Teilen Geschrieben 10. Oktober 2005 Danke Schlati. War eine sehr ausführliche und hilfreiche Antwort. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.