• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

[PHP] MySQL Join: Kleines How To

__struct

Jonagold
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:

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.
 
  • Like
Reaktionen: ImpCaligula

Kein Genie

deaktivierter Benutzer
Registriert
21.02.09
Beiträge
97
Super Erklärung.
Denke aber das es sinnvoller ist noch bin bindValue zu arbeiten, um hier auch auf die einzelnen Typen der Variablen zu prüfen.
 

leonschwartz62

Erdapfel
Registriert
02.09.15
Beiträge
1
Danke :) Coole Erklärungen. Alles leicht zu verstehen. ich bin gerade in meiner Firma damit beschäftigt und suche gerade noch Tutorials zu right, left und outta join. kannst du mir da was empfehlen oder sogar ein eigenes Tutorial verfassen ?
Lieben Dank schonmal vorab :)