Това може да се опрости до следното (ORDER BY
в подзаявката е безполезна):
SELECT *
FROM table
GROUP BY title
Защо мислите, че имате нужда от JOIN
? (Добре, това беше разрешено с коментари).
След вашия коментар, който ви е необходим за всяко заглавие, реда с най-голямо времеви печат, това ще свърши работата:
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
За протокола, оригиналната ви заявка:
SELECT *
FROM
( SELECT *
FROM table
ORDER BY timestamp DESC
) m
GROUP BY title
може да работи според очакванията, но:само в MySQL, което ви позволява да използвате в SELECT
избройте полета, които не са в GROUP BY
клауза (или зависи от тях), без никакви агрегатни функции в тях. Така че горната заявка ще върне повече или по-малко произволна ред за всяко заглавие. Всъщност той ще върне първия ред, който ще намери за заглавие. И така, след като първо стартирате подзаявката (която подрежда по timestamp DESC
) води до намиране на първия ред с най-голямо времеви печат.
Това обаче се случва само защото (кога, ако) оптимизаторът не разбира, че подзаявката е безполезна. Може да откриете, че оригиналната ви заявка работи добре, когато един ден надстроите до MySQL версия 7.5 и заявката ви спре да работи както преди. (тъй като оптимизаторът стана по-умен и преведе заявката ви в по-опростена без под-селекция).
Може дори да откриете, че вашата заявка спира да работи напълно и създава грешка, ако MySQL реши в бъдеща версия да бъде в съответствие със стандартите на SQL за GROUP BY
запитвания.