Это можно упростить до следующего (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
.