Można to uprościć do następującego (ORDER BY
w podzapytaniu jest bezużyteczne):
SELECT *
FROM table
GROUP BY title
Dlaczego uważasz, że potrzebujesz JOIN
? (Ok, zostało to rozwiązane przez komentarze).
Po komentarzu, którego potrzebujesz dla każdego tytułu, wiersza z największym znacznikiem czasu, to zadziała:
SELECT t.*
FROM
table AS t
JOIN
( SELECT title
, MAX(timestamp) AS maxts
FROM table
GROUP BY title
) AS grp
ON grp.title = t.title
AND grp.maxts = t.timestamp
ORDER BY t.timestamp DESC
Dla przypomnienia, Twoje pierwotne zapytanie:
SELECT *
FROM
( SELECT *
FROM table
ORDER BY timestamp DESC
) m
GROUP BY title
może działa zgodnie z oczekiwaniami, ale:tylko w MySQL, który pozwala na użycie w SELECT
lista pól, które nie znajdują się w GROUP BY
(lub od nich zależą), bez żadnych funkcji agregujących w nich. Tak więc powyższe zapytanie zwróci mniej lub bardziej losowe wiersz dla każdego tytułu. W rzeczywistości zwróci pierwszy wiersz, który znajdzie dla tytułu. Tak więc, po pierwszym uruchomieniu podzapytania (które porządkuje według timestamp DESC
) powoduje znalezienie pierwszego wiersza z największym znacznikiem czasu.
Dzieje się tak jednak tylko dlatego, że (kiedy, jeśli) optymalizator nie rozumie, że podzapytanie jest bezużyteczne. Może się okazać, że Twoje oryginalne zapytanie działa poprawnie, gdy pewnego dnia dokonasz aktualizacji do MySQL w wersji 7.5 i Twoje zapytanie przestanie działać tak jak wcześniej. (ponieważ optymalizator stał się bardziej sprytny i przetłumaczył Twoje zapytanie na prostsze bez podwyboru).
Możesz nawet stwierdzić, że Twoje zapytanie całkowicie przestanie działać i spowoduje błąd, jeśli MySQL zdecyduje, że w przyszłej wersji będzie zgodne ze standardami SQL dla GROUP BY
zapytania.