• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> 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 :)