MyBB.de Forum

Normale Version: Realisierung einer komplexen MySQL Query
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Es handelt sich im Prinzip um die gleiche Problemstellung wie in meinem
vorherigen Thema: https://www.mybb.de/forum/thread-13572.html

Ich konnte es bis heute nicht lösen.
Ich habe ein Unterforum für Screenshots.
Ich will eine MyBB Seite machen auf der alle Threads aus diesem Forum mit Thematitel, Benutzer und dem Screenshot (falls vorhanden) angezeigt werden.
Manche Threads haben keinen Screenshot sondern nur ein ZIP, oder beides, oder auch gar keinen Anhang.
Viele der Threads haben 5 oder mehr Bilder wobei das erste Bild in der Auflistung
der Anhänge dann auch dargestellt werden sollte. Die Threads werden oft editiert,
es kommen neue Anhänge dazu oder alte fallen weg. Das macht das ganze sehr
knifflig, weil sich die Reihenfolge und Dateline der Bilder und ZIP's bunt durcheinander verändern kann, man kann einfach nach nichts gehen.
Diese Threads ohne Bild sollen auch dargestellt werden mit einem Standardbild. Es gibt auch Threads mit kleinem Bild als Anhang, die kein generiertes Thumbnail haben, die sollen auch dargestellt werden.
Zehn Ergebnisse werden pro Seite angezeigt.
Es darf für die Darstellung der zehn Ergebnisse nur eine Abfrage verwendet werden. Die Seite wird später vielleicht mal von vielen Nutzern besucht,
so müssen die Queries optimal sein. Vom Hörensagen weis ich,
dass eine andere gleichartige Seite auch nur eine Query verwendet, so möchte
ich das ebenso bei mir machen (auch wegen der Serverlast).
Theoretisch mit meiner erdachten Lösung bräuchte ich 12 Queries pro Seite.
+ 1 für die Threadanzahl (die rechne ich momentan mal nicht mit, die ist ok)
+ 1 für alle Threads mit allen Inhalten + idealerweise die richtigen Attachments*
*+10 für die 10 Attachments, weil ich das im Moment nicht anders hinkriege
Das ist einfach Schwachsinn. Mehr als die zwei obersten sollte ich einfach nicht
benötigen.

Verwende ich "GROUP BY" und nehme ich an, dass ein Bild im Thread ist,
werden mir alle Threads ohne Bilder oder die mit nur ZIP's gar nicht angezeigt.
Verwende ich "GROUP BY" nicht so erhalte ich Vielfachresultate, die ich
nicht haben will und auch nicht verarbeiten kann. Ich habe am Anfang auch
eine Vorab-Query um die genau Threadgesamtanzahl zu bestimmen wegen der
Seitenzahlenberechnung. Somit muß die zweite Query auch wirklich alle Threads
erfassen nicht mehr und auch nicht weniger.
Ich komme einfach nicht weiter wie ich das alles so realisieren soll.
Zitat:Die Seite wird später vielleicht mal von vielen Nutzern besucht, so müssen die Queries optimal sein.

Schreib den Code doch erst mal ohne auf die Anzahl der Queries zu achten, so wie du ihn haben willst, so daß alles funktioniert. Wie man das dann optimieren kann, das kann man sich dann auch noch später überlegen. Ein normaler Server hat bei normaler Last auch kein Problem mit ein paar Queries mehr. Die Anzahl der Queries wird erst dann richtig interessant, wenn du wirklich mehrere Hits pro Sekunde verarbeiten können musst... bzw. wenn du deine Queries so blöd schreibst daß sie wirklich langsam sind.

Fertiger Code hat dann auch den Vorteil daß du konkreten Code anderen vorlegen kannst um nach Optimierungstips zu fragen. Bei deiner Beschreibung hängt man leider etwas in der Luft, da sich deine Problemstellung scheinbar staendig aendert. In deinem letzten Thread hattest du was ähnliches gefragt und von mir auch einen Lösungsansatz bekommen.
Der Code sieht jetzt so aus: Zehn Themen werden pro Aufruf abgefragt (Thema 1-10 auf der ersten Seite usw.):
Vielleicht kann man den Code noch optimieren ohne das korrekte Ergebnis der Abfragen zu beinträchtigen.

$Abfrage = $db->query("SELECT COUNT(tid) AS threads FROM ".TABLE_PREFIX."threads WHERE fid=".$Kategorie." AND sticky=0 AND attachmentcount>0");
$themacount = $db->fetch_field($Abfrage, "threads");

$Seitenzahl = ceil($themacount / $BisThema);

$Abfrage = $db->query("
SELECT t.tid, t.fid, t.uid, t.username, t.subject, t.sticky, t.dateline, t.attachmentcount, t.views, t.replies, a.aid, a.thumbnail, a.filetype, p.pid, t.firstpost
FROM ".TABLE_PREFIX."threads t
LEFT JOIN ".TABLE_PREFIX."posts p ON (p.pid = t.firstpost)
LEFT JOIN ".TABLE_PREFIX."attachments a ON (a.pid = p.pid)
WHERE t.fid=".$Kategorie." AND t.sticky=0 AND t.attachmentcount>0 AND t.visible=1 AND p.visible=1
GROUP BY t.tid
ORDER BY t.dateline DESC
LIMIT $VonThema, $BisThema
");
while($thema = $db->fetch_array($Abfrage))
{

$DateiTyp=$thema['filetype'];

$ISTBild=0;
if(($DateiTyp=="image/jpeg") || ($DateiTyp=="image/gif") || ($DateiTyp=="image/png") || ($DateiTyp=="image/pjpeg"))
{
$ISTBild=1;
}
else
{
$BildchenAbfrage = $db->query("SELECT a.aid, a.thumbnail, a.filetype FROM ".TABLE_PREFIX."attachments a WHERE (a.pid=".$thema['pid']." AND (a.filetype='image/jpeg' OR a.filetype='image/gif' OR a.filetype='image/png' OR a.filetype='image/pjpeg')) LIMIT 0, 1");
while($BildDaten = $db->fetch_array($BildchenAbfrage))
{
$thema['aid']=$BildDaten['aid'];
$thema['thumbnail']=$BildDaten['thumbnail'];
$thema['filetype']=$BildDaten['filetype'];
if($BildDaten['aid']==""){$ISTBild=0;}else{$ISTBild=1;}
}
}
}