Zwei Dinge zu verstehen:
-
Im Allgemeinen sind Ergebnismengen ungeordnet es sei denn, Sie geben einen
ORDER BYan Klausel; soweit Sie eine nicht strikte Reihenfolge angeben (z. B.ORDER BYüber nicht eindeutige Spalten), ist die Reihenfolge, in der Datensätze, die in dieser Reihenfolge gleich sind, in der Ergebnismenge erscheinen, nicht definiert.Ich vermute, dass Sie eine solche nicht strikte Reihenfolge angeben, die die Wurzel Ihrer Probleme ist:Stellen Sie sicher, dass Ihre Reihenfolge streng ist, indem Sie
ORDER BYangeben über eine Reihe von Spalten, die ausreicht, um jeden Datensatz, dessen endgültige Position in der Ergebnismenge Ihnen wichtig ist, eindeutig zu identifizieren. -
DISTINCTkannGROUP BYverwenden , wodurch die Ergebnisse nach den gruppierten Spalten geordnet werden; das heißt,SELECT DISTINCT a, b, c FROM terzeugt eine Ergebnismenge, die so aussieht, als obORDER BY a, b, cangewendet wurde. Auch hier wird dieser Effekt außer Kraft gesetzt, wenn Sie eine ausreichend strenge Reihenfolge angeben, um Ihre Anforderungen zu erfüllen.
Nach Ihrer Aktualisierung und unter Berücksichtigung meines obigen Punkts Nr. 2 ist klar, dass die Gruppierung der Ergebnisse zum Erreichen von DISTINCT Auswirkungen hat macht es unmöglich, nach der nicht gruppierten Spalte p.id zu sortieren; Stattdessen möchten Sie:
SELECT t.*
FROM Threads t INNER JOIN Posts p ON t.id = p.threadid
GROUP BY t.id
ORDER BY MAX(p.id) DESC