Задавайте вопросы, мы ответим
Вы не зашли.
Кто-нибудь может подсказать, как можно в одном запросе реализовать следующее.
В таблице много записей, один из столбцов, назовём его theme, может принимать значения от 1 до, например, 20 и никаких больше, определяет тему для данной записи. Надо выбрать для каждой темы последнюю добавленную запись. Т.е. мы должны получить 20 строк, у которых будут уникальные значения theme и при этом они будут последними добавленными в своей теме.
id | theme | text | date
1 | 1 | раз | 2008-01-15
2 | 3 | два | 2008-01-01
3 | 2 | три | 2008-01-14
4 | 3 | четыре| 2008-01-10
5 | 1 | пять | 2008-01-10
Т.е. из такой таблички мы должны получить только 1, 3 и 4-ую строки.
Неактивен
Официальный способ такой: сначала выбрать нужные id, а потом выбрать по ним данные:
SELECT * FROM tablename WHERE id IN (SELECT MAX(id) FROM tablename GROUP BY theme)
Для такого запроса обязательное требование - чтобы id были автоинкрементальными (в
Вашем примере это нарушено). В реальных базах это условие почти всегда соблюдается.
Правильный с точки зрения логики способ - объединить не по id, а по дате (но тогда есть
ненулевая вероятность, что вы вытащите несколько строк с одной датой для одной темы,
т.к. логически они неотличимы):
SELECT t1.* FROM tablename t1
JOIN (SELECT theme, MAX(date) AS date FROM tablename GROUP BY theme) t2
USING (theme, date)
Неактивен
Спасибо. Но методом тыка выяснил, что можно воспользоваться таким запросом SELECT MAX( date ), id, theme, text FROM my_table GROUP BY 3
Неактивен
Посмотрите на Ваш запрос внимательнее. Он выдаст id и text не соответствующие date. Вообще говоря он некорректен, так как вы смешиваете группируемые и негруппируемые переменные.
Неактивен
Да, так и есть. Спасибо большое
Неактивен