potrzebuję pomocy z grupowaniem tj. mam tabelę
CREATE TABLE modifications ( id int PRIMARY KEY AUTO_INCREMENT, date timestamp DEFAULT timestmp NOT NULL, object_id int, -- fk to objects status_id int, -- fk to statuses );
i chciałbym pobrać wszystkie wiersze, w których status_id jest najnowszy (max(date)) w ramach jednego object_id. Mówiąc krótko, dla każdego okiektu potrzebny mi najnowszy status.
Działa (ale za wolno, bo ok. 200 ms)
SELECT f.* FROM modifications f WHERE (f.obiect_id, f.date) IN (SELECT g.obiect_id AS obiect_id, max(g.date) AS date FROM modifications g GROUP BY g.obiect_id)
Samo zrobienie:
SELECT * FROM modifications GROUP BY obiect_id HAVING date=max(date)
nie działa, ponieważ zwraca pierwszy napotkany status, a nie ten pasujący do maksymalnej daty (nie najnowszy, a pierwszy insertowany).
Jak powinno wyglądać najprostsze zapytanie, żeby zwrócić najnowszy status dla każdego obiektu ?