Zwei Dinge zu verstehen:
-
Im Allgemeinen sind Ergebnismengen ungeordnet es sei denn, Sie geben einen
ORDER BY
an 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 BY
angeben über eine Reihe von Spalten, die ausreicht, um jeden Datensatz, dessen endgültige Position in der Ergebnismenge Ihnen wichtig ist, eindeutig zu identifizieren. -
DISTINCT
kannGROUP BY
verwenden , wodurch die Ergebnisse nach den gruppierten Spalten geordnet werden; das heißt,SELECT DISTINCT a, b, c FROM t
erzeugt eine Ergebnismenge, die so aussieht, als obORDER BY a, b, c
angewendet 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