Seite 2 von 2
Verfasst: 04.10.2008 00:29
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.
Verfasst: 04.10.2008 00:41
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

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

Verfasst: 04.10.2008 00:45
von 4seven
super erklärt und danke

Verfasst: 04.10.2008 00:47
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

Verfasst: 04.10.2008 00:52
von 4seven
ergänzend gut, danke

Verfasst: 04.10.2008 01:50
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....

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
Verfasst: 04.10.2008 02:14
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).
Verfasst: 04.10.2008 07:17
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
