Hi, für ein Forum schreibe ich derzeit an einem kleinen Statistik-Skript und dabei wollte ich gern eine Abfrage drin haben, die mir liefert, welche User über den Zeitraum einer Woche die meisten Beiträge geschrieben haben. Meine bisherige Abfrage dafür sieht so aus:
SQL-Anweisung
1: 2: 3: 4: 5: 6: 7: 8: 9:
| SELECT DISTINCT p1.poster_id, MAX( p2.post_time ) AS max_post_time, COUNT( p2.poster_id ) AS user_posts FROM phpbb_posts AS p1 INNER JOIN phpbb_posts AS p2 ON ( p1.poster_id = p2.poster_id AND p1.poster_id <> -1 AND p2.poster_id <> -1 AND p2.post_time - p1.post_time > -7 *86400 AND p2.post_time - p1.post_time <=0 ) GROUP BY p1.post_id ORDER BY user_posts DESC |
Die zurückgegebenen Daten klingen zwar plausibel, jedoch gibt es zwei wesentliche Probleme:
1. Die Abfrage benötigt knapp 5 Minuten und legt während dieser Zeit den Webserver incl. Forum nahezu lahm ...
2. Die Abfrage liefert für jedes Posting den Stand der Postings die der zugehörige User im besagten Zeitraum vor diesem Posting verfasst hat
Zur Dimension:
ca. 30 User bei ~23000 Postings (User relativ konstant, Postingzahl stark wachsend)
Was ich bräuchte:
1. eine Optimierung, dass diese Abfrage in <30 Sekunden geht (obwohl PHP die Ausführungszeit für Abfragen nicht mit einrechnet)
2. eine Erweiterung der Abfrage, dass ich für jeden User nur jeweils das Maximum (ersten Datensatz für jede UID) bekomme.
Was zu vermeiden ist:
1. Stored Procedures
2. Temporäre Tabellen
TIA.
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.