MySQL-Abfrage: 3 Tabellen verknüpfen

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
4seven
Mitglied
Beiträge: 5869
Registriert: 21.04.2007 06:18

Beitrag von 4seven »

dazu mal eine frage:

was ist eigentlich der unterschied zwischen p., t. und u., was bewirkt es und wo und wie wird es definiert?
hatte es nie so mit sql, wenn man von einfachen standardabfragen absieht.
Boecki91
Ehemaliges Teammitglied
Beiträge: 4744
Registriert: 18.06.2006 15:21

Beitrag von Boecki91 »

Dazu ein Beispiel

Code: Alles auswählen

SELECT u.username
FROM users u
LEFT JOIN topics t ON u.user_id = t.poster_id
LEFT JOIN posts p ON t.poster_id = p.poster_id AND p.post_id = t.last_post_id
WHERE p.post_id IS NOT NULL AND t.forum_id = 1
ORDER BY p.post_time DESC
Definiert wird das ganze beim FROM bzw LEFT JOIN etc. das sind Abkürzungen für die einzelnen Tabellen, weil wir Programmierer nun mal schreibfaul sind :D Man setzt diese Kürzel dann vor die Spalten damit man diese eindeutig zuordnen kann, da diese halt manchmal doppelt vorkommen, momentan fällt mir dazu phpBB2 die beiden Tabellen post und post_text ein, beide haben eine Post_id wenn du nun eine abfrage machst willst du nur die Ergebnisse haben wo die beiden IDs gleichsind also schreibst du z.b.
WHERE p.post_id = pt.post_id


Hoffe mal das das verständlich zu später Stunde erklärt ist, ich lese es später nochmal gegen :grin:
Standart: Am besten mit beiden Beinen auf dem Boden
Standardmäßig antworte ich nicht auf PMs
4seven
Mitglied
Beiträge: 5869
Registriert: 21.04.2007 06:18

Beitrag von 4seven »

super erklärt und danke :grin:
Benutzeravatar
Miriam
Mitglied
Beiträge: 12310
Registriert: 13.10.2004 07:18
Kontaktdaten:

Beitrag von Miriam »

Das sind Tabellenaliase, man hätte auch die Tabellennamen direkt nehmen können. Aber das ist einfach zu viel Schreibarbeit.
Teilweise gibt es Spalten in den Tabellen mehrfach (also mit gleichem Namen) dann muss man die Spalten eindeutig bezeichnen.
Also wird der Alias, den man selbst definiert hat (FROM phpbb_posts p oder FROM phpbb_posts p1) vor die Tabellenspalte der betreffenden Tabellen geschrieben.
Dann behält man auch besser den Überblick.

Such mal nach SQL Alias, da wirst Du bestimmt fündig.

//edit: Zu spät .. der Hund hat zu lange gebraucht :-P
Gruss, Miriam.
Ich schmeiß' alles hin und...
... lasse es liegen
4seven
Mitglied
Beiträge: 5869
Registriert: 21.04.2007 06:18

Beitrag von 4seven »

ergänzend gut, danke :grin:
Seether
Mitglied
Beiträge: 1446
Registriert: 10.10.2002 23:42

Beitrag von Seether »

Miriam hat geschrieben:Also die Query, die ich vorschlug dauerte in der DB 0,314 Sek bei 30.000 Postings beim ersten Aufruf.
Beim nächsten ist sie ja gecached.... :grin:
Naja ich habe ein paar Postings mehr und 0,314 sec ist VIEL zu VIEL! Das meine ich ernst.

Bei phpBB2 habe ich teilweise getunt für 0,0x Sekunden.
Ein paar tweaks, die zwar evtl nicht ganz sauber sind, aber im Prinzip das gleiche bewirken wie der Original Code. Dadurch kam die Forenübersicht dann auf 0.2 bis 0.25sec. Vorher war es irgendwas zwischen 0.5 und 1.5
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag von gn#36 »

Naja die Abfrage ist ja auch alles andere als optimal. Zunächst einmal werden sämtliche Einträge aller drei Tabellen mit sämtlichen Einträgen der jeweils anderen Tabellen überlagert (sprich Anzahl der Datensätze in Tabelle 1 x # Datensätze in 2 x # Datensätze in 3 insgesamt), dann wird aus diesem Monster per WHERE herausgefiltert und anschließend noch sortiert. Dass das bei großen Tabellen dauern kann (und die Posts Tabelle ist im allgemeinen ja nicht klein) ist logisch. Besser wäre es sowas wie einen LEFT JOIN oder ähnliches Verwenden, wo nur man von vorne herein nur Datensätze aus einer Tabelle bekommt.

Wenn man hier die Posts Tabelle als "Master" nimmt und die beiden anderen Tabellen per LEFT JOIN dazu mappt (ein Post kann nur einen Ersteller haben und auch nur zu einem Thema gehören also ist die Zuordnung in beiden Fällen eindeutig), dann sollte man eigentlich das gleiche Resultat schneller bekommen können weil eben nicht erst noch alle falschen Daten gemappt werden und dann weggeworfen (oder zumindest nicht so viele).
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Benutzeravatar
Miriam
Mitglied
Beiträge: 12310
Registriert: 13.10.2004 07:18
Kontaktdaten:

Beitrag von Miriam »

Seether hat geschrieben:Dadurch kam die Forenübersicht dann auf 0.2 bis 0.25sec. Vorher war es irgendwas zwischen 0.5 und 1.5
Super :wink:
Gruss, Miriam.
Ich schmeiß' alles hin und...
... lasse es liegen
Antworten

Zurück zu „Coding & Technik“