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.
MySQL-Abfrage: 3 Tabellen verknüpfen
Dazu ein Beispiel
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
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
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

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

Standart: Am besten mit beiden Beinen auf dem Boden
Standardmäßig antworte ich nicht auf PMs
Standardmäßig antworte ich nicht auf PMs
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
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

Gruss, Miriam.
Ich schmeiß' alles hin und...
... lasse es liegen
Ich schmeiß' alles hin und...
... lasse es liegen
Naja ich habe ein paar Postings mehr und 0,314 sec ist VIEL zu VIEL! Das meine ich ernst.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....
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
- gn#36
- Ehrenadmin
- Beiträge: 9313
- Registriert: 01.10.2006 16:20
- Wohnort: Ganz in der Nähe...
- Kontaktdaten:
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).
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.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.