Zum Inhalt springen

Join-Befehl


illuminatus26

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...