• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

JOINS Erklärung.

DD-Stylz

Neues Mitglied
Abend ,

ich habe ein Problem und zwar raffe ich net wie und wo ich die JOINS einsetzten muss,

könnte mir vielleicht jemand kurz INNER / LEFT / RIGHT JOIN erklären und einen Beispiel dazu angeben?

Habe mir natürlich die Bücher im i-net durchgelesen aber werde net schlau draus.

wäre sehr net, Danke ;)
 
Werbung:
Dann wenn du Daten in mehreren Tabellen verknüpft sind brauchst du joins. Ich finde aber das auf den meisten Seiten im Internet das gut erklärt wird.
 
Werbung:
Joins sind doch gerade die Stärke von SQL.

inner joins sind die meistbenutzten.
Wenn du zwei Tabellen hast (users und guestbook_entries), für ein Gästebuch, bspw.

users:
user_id int(11) not null primary key auto_increment
username varchar(255) not null
last_login int(11) unsigned not null

guestbook_entries
entry_id int(11) not null primary key auto_increment
content blob not null
author int(11) not null
written_on int(11) unsigned not null


Wenn du also niemals einen User oder einen Eintrag aus deinem Gästebuch löschen würdest. Du willst alle Einträge deines Gästebuch sehen willst, dabei aber nur einmal mysql_query() machen.

Code:
select
  guestbook_entries.content as inhalt,
  guestbook_entries.written_on as datum,
  users.username as benutzername
from
  guestbook_entries,
  users
where
  guestbook_entries.author = users.user_id
order by
  datum desc
PHP:
$sql = DAS_VON_OBEN;
$result = mysql_query($sql);
while($row = mysql_fetch_assoc($result)) {
  echo '<hr>';
  echo 'Benutzername:'.htmlspecialchars($row['benutzername']);
  echo '<br>Datum des Eintrags: '.date('d.m.Y H:i',$row['datum']);
  echo '<p><b>Inhalt:</b><br />'.nl2br(htmlspecialchars($row['inhalt'])).'</p>';
}
mysql_free_result($result);
Kleine Erklärung:
Du verknüpfst zwei Tabellen (bei der where Klausel) indem du die user-ID aus der Tabelle der User mit der User-ID des Autors in der Tabelle der Einträge vergleichst.


Wenn du aber ab und zu User löschst, die Einträge aber nicht musst du das so machen:

Code:
select
  guestbook_entries.content as inhalt,
  guestbook_entries.written_on as datum,
  users.username as benutzername
from
  guestbook_entries,
left join
  users
on
  guestbook_entries.author = users.user_id
order by
  datum desc
Wenn ein User gelöscht wurde, steht in "benutzername" NULL und nicht ein leerer String.
PHP:
$sql = DAS_VON_OBEN;
$result = mysql_query($sql);
while($row = mysql_fetch_assoc($result)) {
  echo '<hr>';
  if ($row['benutzername']===null) {
    echo '<i>Gast</i>';
  } else {
    echo 'Benutzername:'.htmlspecialchars($row['benutzername']);
  }
  echo '<br>Datum des Eintrags: '.date('d.m.Y H:i',$row['datum']);
  echo '<p><b>Inhalt:</b><br />'.nl2br(htmlspecialchars($row['inhalt'])).'</p>';
}
mysql_free_result($result);


Right Join ist sehr selten benutzt.
 
Zuletzt bearbeitet:
Nein. Falsch ausgedrückt. Besser:

Wenn Daten eines Statements in mehreren Tabellen stehen könnten, verknüpft man diese Tabellen per JOIN mit der Haupttabelle.
Was ist daran besser? Wenn du einen join brauchst, dann könnten die Daten nicht zusammen gehören sondern sie tun es
 
Werbung:
Was ist daran besser? Wenn du einen join brauchst, dann könnten die Daten nicht zusammen gehören sondern sie tun es

Wenn sie immer zusammengehören braucht man kein JOIN, das geht auch über FROM mit einer WHERE-Formulierung. Und das ist der Unterschied zum JOIN: dort können sie zusammengehören, müssen aber nicht.
 
Werbung:
Ach und die explizite Schreibweise ist vermutlich auch besser (vermutlich weil mysql ziemlich viel optimiert, d.h. es unter Umständen doch keinen Unterschied macht)
 
Wenn sie immer zusammengehören braucht man kein JOIN, das geht auch über FROM mit einer WHERE-Formulierung. Und das ist der Unterschied zum JOIN: dort können sie zusammengehören, müssen aber nicht.
Das ist doch falsch. Wie baust du dann den join zusammen, wenn du kein Feld hast mit dem Datensätze verknüpft sind?
 
Die Felder müssen vorhanden sein, klar. Aber es müssen keine zusammengehörenden Datensätze in diesen existieren.

Beispiel:
2 Tabellen, eine "Nutzer" und eine "MSN".

Nutzer:
nutzerid | name

MSN
msnid | nutzerid | wert

Wenn man nun eine Liste der Nutzer haben möchte mit der Angabe ob zu diesem ein MSN-Wert hinterlegt ist oder nicht nutzt man folgendes Statement:

Code:
SELECT Nutzer.name, COUNT(MSN.msnid) AS Anzahlmessenger 
FROM Nutzer
LEFT OUTER JOIN MSN ON MSN.nutzerid = Nutzer.nutzerid
GROUP BY Nutzer.nutzerid

Das Ergebnis wäre eine Tabelle die alle in der Tabelle Nutzer vorhandenen Namen ausgibt und die Anzahl der MSN-Werte zu jedem. Hat ein Nutzer keinen MSN-Wert ist zu diesem folglich auch kein Eintrag in der Tabelle MSN vorhanden. Das sähe dann z.B. so aus:

Name | Anzahlmessenger
Max | 2
Moritz | 3
Paul | 0

Zu Paul gäbe es keinen Eintrag in der Tabelle MSN.

Würde man das selbe ohne JOIN machen sähe es so aus:
Code:
SELECT Nutzer.name, COUNT(MSN.msnid) AS Anzahlmessenger 
FROM Nutzer, MSN
WHERE MSN.nutzerid = Nutzer.nutzerid
GROUP BY Nutzer.nutzerid

und im Ergebnis würde "Paul" fehlen, da er eben nicht in der Tabelle MSN vorhanden ist:

Name | Anzahlmessenger
Max | 2
Moritz | 3
 
Werbung:
lol klopt euch net ^^


damit ich es richtig verstehe

LEFT JOIN

werden die Daten aus tabelel1 und tabelle2 vergliechen und dann wird die Linksstehende tabelle (tabelle1) mit den Datensätzten aus tabelle2 erweitert, natürlich nur wenn in tabelle2 eine zustimmung auf das Gesuchte auftritt

bei RIGHT JOIN genau umgekehrt.
 
...
inner joins sind die meistbenutzten.
....
logisch, da nehezu alle scripte die hier und anderen orts besprochen werden, in ihren select anweisungen (tabellen aufbauten) so aufgebaut sind, dass man mit inner joins arbeiten muss.

ob inner, outer, left oder right join hängt immer davon ab, was als ergebnismenge herauskommen soll. von daher ist es vollkommen unsinnig von häufikeiten zu reden, es hängt davon ab, was gebraucht wird.

die definition von joins ist eindeutig, dazu braucht man nur das handbuch lesen !
joins sind referenzierungen, das ergebnis ist IMMER eine kreuztabelle.

eine abfrage mit where ist ein durchackern von daten. ich lese aus der einen tabelle alles aus und vergleich mit tabelle 2 ob eine bestimmte bedingung erfüllt ist.

join mit einer where klausel zu vergleichen ist wie äpfel mit birnen zu vergleichen. wer joins verwenden kann wird wesentlich schneller zum ziel kommen als das selbe ergebnis mit einer where klausel zusammen zu frickeln...
 
Zuletzt bearbeitet von einem Moderator:
Zurück
Oben