- Registriert
- 11.04.13
- Beiträge
- 20
Joins in MySql sind nützlich um zwei Tabellen auszulesen die Gemeinsamkeiten haben.
Als Beispiel soll folgende Struktur angenommen werden:
Tabelle 1:
Name: Autoren
- Spalte 1 : AutorenID
- Spalte 2 : AutorenAvatar
Tabelle 2:
Name: PrivateNachrichten
- Spalte 1 : NachrichtenID
- Spalte 2 : SenderID
- Spalte 3 : EmpfängerID
- Spalte 4 : NachrichtenText
Als Ziel möchte ich hier die neuste Nachricht des entsprechenden Nutzers auslesen und mit dem Avatar des Senders darstellen.
Man könnte zwei Queries absenden von denen die erste die Zeile mit der Nachricht und der SenderID ausliest und danach eine zweite Query mit der man anhand der SenderID den Avatar ausliest.
Oder man geht Tabellenübergreifend vor und macht dass in einem Zug mittels Join.
Implizite Joins sind die einfachste Form ohne Zusätze wie "LEFT JOIN", "RIGHT JOIN" etc.
Ergänzend: Um nicht jedes mal den Tabellennamen voll ausschreiben zu müssen nutzen wir ein "Kürzel" das nach Angabe der Tabelle in Form eines beliebigen Strings definiert wird.
Hier m für die Nachrichtentabelle und a für die Autorentabelle.
Um den EIntrag mit der frischesten ID zu bekommen kann man DESC nutzen. Mit LIMIT 1 reduzieren wir die Ausgabe auf den aktuellsten Eintrag.
Unsere Query:
Und als prepared Statement:
Das ganze geht auch über mehrere Tabellen:
Beispiel:
Man muss übrigens nicht zwangsläufig den Tabellennamen vor den Spaltennamen setzen. Ist der Spaltenname über die "gejointen Tabellen" einmalig KANN man ihn weglassen.
Als Beispiel soll folgende Struktur angenommen werden:
Tabelle 1:
Name: Autoren
- Spalte 1 : AutorenID
- Spalte 2 : AutorenAvatar
Tabelle 2:
Name: PrivateNachrichten
- Spalte 1 : NachrichtenID
- Spalte 2 : SenderID
- Spalte 3 : EmpfängerID
- Spalte 4 : NachrichtenText
Als Ziel möchte ich hier die neuste Nachricht des entsprechenden Nutzers auslesen und mit dem Avatar des Senders darstellen.
Man könnte zwei Queries absenden von denen die erste die Zeile mit der Nachricht und der SenderID ausliest und danach eine zweite Query mit der man anhand der SenderID den Avatar ausliest.
Oder man geht Tabellenübergreifend vor und macht dass in einem Zug mittels Join.
Implizite Joins sind die einfachste Form ohne Zusätze wie "LEFT JOIN", "RIGHT JOIN" etc.
Ergänzend: Um nicht jedes mal den Tabellennamen voll ausschreiben zu müssen nutzen wir ein "Kürzel" das nach Angabe der Tabelle in Form eines beliebigen Strings definiert wird.
Hier m für die Nachrichtentabelle und a für die Autorentabelle.
Um den EIntrag mit der frischesten ID zu bekommen kann man DESC nutzen. Mit LIMIT 1 reduzieren wir die Ausgabe auf den aktuellsten Eintrag.
Unsere Query:
Code:
SELECT m.NachrichtenID, m.SenderID, m.EmpfängerID, m.NachrichtenText, a.AutorenAvatar
FROM PrivateNachrichten m, Autoren a
WHERE m.EmpfängerID = ? AND a.AutorenID = m.SenderID
ORDER BY m.NachrichtenID DESC LIMIT 1
Und als prepared Statement:
Code:
$sth = $dbh->prepare(' SELECT m.NachrichtenID, m.SenderID, m.EmpfängerID, m.NachrichtenText, a.AutorenAvatar
FROM PrivateNachrichten m, Autoren a
WHERE m.EmpfängerID = ? AND a.AutorenID = m.SenderID
ORDER BY m.NachrichtenID DESC LIMIT 1 ');
$NutzerID = 1;
$sth->execute(array($NutzerID));
$r = $sth->fetch();
var_dump($r);
Das ganze geht auch über mehrere Tabellen:
Beispiel:
Code:
SELECT news.id, news.rubric, news.title, news.date, news.message, news.tags, news.img_url, news.count_comments, news.count_likes, news.count_views, news.headline, news.bg, authors.id, authors.a_name, authors.avatar, authors.signature, authors.count_pub, authors.registeredon, authors.privatefolder, rubrics.rubrics
FROM news, authors, rubrics
WHERE news.id = ? AND news.disabled IS NOT NULL AND authors.id = news.author AND rubrics.id = news.rubric;
Man muss übrigens nicht zwangsläufig den Tabellennamen vor den Spaltennamen setzen. Ist der Spaltenname über die "gejointen Tabellen" einmalig KANN man ihn weglassen.