Hallo, Gast! (Registrieren)

Letzte Ankündigung: MyBB 1.8.8 veröffentlicht (17.10.16)


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste
Optimale MySQL Query zur Erfassung von Themen Inhalten in einem Unterforum XY
#1
Ich habe mir eine MyBB Unterseite screenshot.php gebastelt und ein Template dazu, nach der Anleitung (eine eigene MyBB Unterseite erstellen...).
Auf dieser Seite will ich nun aus einem Unterforum alle Beiträge anzeigen lassen mit Titel, Author und dem Thumbnail des hochgeladenen Screenshots der Person.
Ein Thema enthält bis zu zehn Screenshots und ein oder mehrere ZIP-Archive.
Ich bräuchte praktisch immer den ersten Screenshot von allen den Anhängen.
Dabei bin ich auf verschiedenartige Probleme und Fragen gestossen, die ich nicht mehr selbst lösen konnte.

Zum einen: Ich habe erkannt, dass ich dazu jeweils drei Tabellen pro Thema
abfragen muß, weil in der Tabelle Threads die Post-ID nicht gespeichert wird
bzw. weil in der Tabelle Attachments nicht auf die jeweilige Thread-ID mit
referenziert wird:
mybb_threads für die Threaddaten, Titel und Author
mybb_posts um die PID zu dem zugrundeliegenden Thread zu erhalten
mybb_attachments um die URL zum Thumbnail zu der PID des Threads zu erhalten

Wenn ich nun 10 Ergebnisse pro Seite anzeigen lassen will, bräuchte ich hier
theoretisch 10 x 3 Abfragen, also mindestens 30 SQL Abfragen nach meinem bisherigen Verständnis.

Wenn ich mich nun einem LEFT JOIN behelfe, was ich auch versucht habe, kann ich
die 3 Abfragen in eine packen, doch dann erhalte ich zu einem Thema mehrere Doppel-Ausgaben. Wenn das Thema 5 Anhänge hat erhalte ich fünf Rückgaben, wenn es drei hat drei usw.
Ein SELECT DISTINCT konnte das Problem nicht beheben.
Ein GROUP BY "t.TID" t=Tabelle Threads führte dazu, dass mir nur jeweils das erste Attachment zurückgeliefert wird. Wenn das nicht der Screenshot war, so erhalte ich nun in meiner Auflistung kein Vorschaubild zu dem Thema.

Also das Ganze sieht nun wie folgt aus:
Kann / muss man das noch irgendwie optimieren?
Wie bekomme ich das Attachment Screenshot anstatt des ZIP-Archives?

* AND (a.filetype='image/jpeg' OR a.filetype='image/gif' OR a.filetype='image/png')

Früher hatte ich noch die Zeile mit drin, wenn aber das erste ausgewählte
Attachment ein ZIP Archiv war, dann hat er einfach den Thread ganz
in der Auflistung ausgelassen, somit habe ich die Zeile wieder weggelassen.

PHP-Code:
$Abfrage $db->query("
        SELECT t.tid, t.fid, t.uid, t.username, t.subject, t.sticky, t.dateline, t.attachmentcount, t.views, a.aid, a.thumbnail, a.filetype 
        FROM "
.TABLE_PREFIX."threads t
        LEFT JOIN "
.TABLE_PREFIX."posts p ON (p.tid = t.tid)
                LEFT JOIN "
.TABLE_PREFIX."attachments a ON (a.pid = p.pid)
        WHERE t.fid=25 AND t.sticky=0 AND t.attachmentcount>0 *
                GROUP BY t.tid
        ORDER BY t.dateline DESC
        LIMIT 
$von$perpage
    "
);

while(
$Thema $db->fetch_array($Abfrage))
{
//In diesem Abschnitt befülle ich eine Variable mit den Daten und gebe sie
//später im Template zusammen mit einer Tabelle aus.
echo $Thema['subject']; //Das würde jetzt den Thementitel ausgeben

In der Politik ist es manchmal wie in der Grammatik: Ein Fehler, den alle begehen, wird schließlich als Regel anerkannt.
André Malraux
Zitieren
#2
Ich würde das spontan auf zwei Queries aufteilen. Aber vielleicht kommt ja jemand noch auf eine bessere Lösung.

Zitat:Ich bräuchte praktisch immer den ersten Screenshot von allen den Anhängen.

Code:
SELECT MIN(a.aid) AS screenshot
FROM mybb_threads t
LEFT JOIN mybb_posts p ON (p.tid=t.tid)
LEFT JOIN mybb_attachments a ON (a.pid=p.pid)
WHERE t.fid=25 AND t.sticky=0 AND t.visible=1 AND t.attachmentcount>0 AND p.visible=1 AND a.thumbnail!=''
GROUP BY t.tid

Das ist jeweils der erste Screenshot (als attachment-id) von allen in Frage kommenden Anhängen.

Der Rest ist trivial: Ausgehend von diesen Screenshots holst du dir das Posting / den Thread und damit das Datum / den Titel / den Autor.
Zitieren
#3
Danke frostschutz für Deinen Vorschlag. Smile

Ich lasse das Thema trotzdem mal noch offen, falls jemand noch irgendwelche
Ergänzungen, Anmerkungen, Verbesserungen oder Optimierungen dazu parat hat.
In der Politik ist es manchmal wie in der Grammatik: Ein Fehler, den alle begehen, wird schließlich als Regel anerkannt.
André Malraux
Zitieren
#4
Bin mir allerdings auch nicht sicher ob man das mit Thumbnail so machen kann, also ob jedes Bild einen Thumbnail hat. Kleine Bilder haben vielleicht gar keinen. Hab ich nicht nachgeschaut. Wäre nur einfacher so zu schreiben als auf jeden Image-Typ zu testen. Aber bei Screenshots gehts vermutlich eh nur um deutlich größere Grafiken.

Und der Test ob der User berechtigt ist, die Attachments / die Threads zu sehen fehlt natürlich auch noch. Wink
Zitieren
#5
Zitat:Kleine Bilder haben vielleicht gar keinen

Das kann ich bestätigen. In diesem Fall muss ich testen,
ob die Thumbnail-Spalte leer ist und wenn ja ein Standardbild anzeigen.

Zitat:Und der Test ob der User berechtigt ist, die Attachments / die Threads zu sehen fehlt natürlich auch noch

Was in diesem Falle unerheblich ist, da es sich um eine öffentliche Unterseite handelt, die gerade den Unregistrierten eine Art schnelle Übersicht bzw. Vorschau geben soll, welche Inhalte die Seite denn anzubieten hat.
Erst lange im Forum alles durchgucken wollen Gäste ja bekanntlich sowieso nicht Wink
In der Politik ist es manchmal wie in der Grammatik: Ein Fehler, den alle begehen, wird schließlich als Regel anerkannt.
André Malraux
Zitieren


Möglicherweise verwandte Themen...
Thema Verfasser Antworten Ansichten Letzter Beitrag
  Realisierung einer komplexen MySQL Query Riccardo 2 961 14.07.2009, 18:53
Letzter Beitrag: Riccardo
  2 Tabellen in einem Query Waluigi 8 1.585 14.07.2009, 00:27
Letzter Beitrag: Michael
  [Gelöst]MYSQL Fehler in UPDATE Query Jan 3 1.300 27.02.2007, 15:52
Letzter Beitrag: Jan