Frage

Ich habe Probleme beim Bilden einer MySQL-Abfrage, die die folgende Aktion ausführt:

Alles auswählen threadIDs von der Gewinden Tabelle Reihenfolge durch den Zeitstempel (in absteigender Reihenfolge) von dem letzten Posten (größte Zeitstempel) mit threadID gleich dem threadID jeden Threads. Also im Grunde möchte ich durch die Fäden gehen und MySQL die Datenbank überprüfen lassen sagen Thread 0. dann all die Beiträge überprüft, die threadID von 0 und Sorten haben Thread0 innerhalb von Thread0 auf dem größten Zeitstempel der Beiträge basiert. Dann wiederholt er dies für thread1, thread2, etc und sortiert sie entsprechend an.

Ist das überhaupt möglich? Es ist die „bump-System“ -Effekt des Forum zu schaffen, in dem zuletzt aktiven Thread kontinuierlich an die Spitze der Liste gestoßen wird, bis der Thread stirbt, dann fällt es auf den Boden. Ich habe eine andere Implementierung zu verwenden, wo ich einen lastActivity Zeitstempel in der Themen-Tabelle gespeichert und aktualisiert, wenn ein neuer Beitrag in den Thread abgegeben wurde, aber diese Abfrage würde die Dinge sehr viel effizienter machen.

Vielen Dank! Es gibt zwei Tabellen relevant hier: Themen und Beiträge. Die Pfosten haben ein threadID Feld, das die ID des Threads speichert, zu der es gehört, und es hat auch ein Zeitstempel-Feld. Themen hat ein Feld threadID, die sich auf die Post des threadID entspricht.

War es hilfreich?

Lösung

Im Folgenden ist für mich in der Vergangenheit auf MySql gearbeitet. Wenn Sie mehr über die einzelnen Thread in der Abfrage enthalten sein möchten, müssen Sie die Spalten der SELECT und der GROUP BY hinzufügen.

select thread.threadID, max(comments.modifiedOn) as threadUpdated 
   from thread inner join comments on thread.threadID = comments.threadID 
   group by 1 
   order by 2 desc;

Diese Abfrage dient Ihre primäre Anforderung, die eine Liste der Themen ist mein letzter Kommentar bestellt. Es wird nicht zurückkehren Fäden ohne Kommentare wie sie ist, müssen Sie die zu einem äußeren Verknüpfung ändern join das zu tun.

Andere Tipps

SELECT  *
FROM    threads t
LEFT JOIN
        posts p
ON      p.id =
        (
        SELECT  p.id
        FROM    posts pi
        WHERE   pi.threadID = t.threadID
        ORDER BY
                pi.timestamp DESC
        LIMIT 1
        )

einen Index für posts (threadID, timestamp) Having wird diese Abfrage erheblich verbessern.

Beachten Sie, dass im Gegensatz zu GROUP BY Lösungen, diese Abfrage auch alle Felder aus posts auswählt und funktioniert auch, wenn Sie Duplikate auf dem neuesten posts.timestamp haben.

SELECT t.*, p1.`timestamp`
FROM threads t 
  JOIN posts p1 ON (p1.threadid = t.id)
  LEFT JOIN posts p2 ON (p2.threadid = t.id 
    AND p1.`timestamp` < p2.`timestamp`)
WHERE p2.threadid IS NULL
ORDER BY p1.`timestamp` DESC;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top