Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Join-Befehl

Empfohlene Antworten

Veröffentlicht

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

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

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.

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 )

Sorry.

mysql 4.0.26

Nee, leider nicht kommt der selbe Fehler wie bei meiner Abfrage.

#1066 - Not unique table/alias: 'tipspiel__mannschaften'

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

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.

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.

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.

Danke Schlati.

War eine sehr ausführliche und hilfreiche Antwort.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.