2011-01-14 13 views
5

tabela: UUID, wersja, datetimeMySQL - grupa przez z Zamówienie przez DESC

wersja nie jest wyjątkowy, ale chodzi o to, aby sprowadzić tylko wiersze z najnowszego datetime dla danego UUID

SELECT * FROM table WHERE uuid='bla' GROUP BY version ORDER BY datetime desc

... oczywiście dostaje dane o wynikach asc - czy istnieje sposób "zamówienia" grupy według opisu, aby pobrać tylko najnowszą wersję?

Odpowiedz

21

ponieważ tabela zawiera tylko te 3 pola, a ty filtrując przez UID można po prostu użyć MAX bez JOIN:

SELECT version, MAX(datetime) Maxdatetime 
FROM table 
WHERE uuid='bla' 
GROUP BY version 

Jednakże, jeśli tabela miał więcej pól, albo nie są filtrowania przez uid - trzeba najpierw uzyskać datetime max dla każdej wersji, a następnie wybierz z rzędu:

SELECT t.uuid, t.version, t.datetime 
FROM table t JOIN (
    SELECT version, MAX(datetime) Maxdatetime 
    FROM table 
    WHERE uuid='bla' 
    GROUP BY version 
) r ON t.version = r.version AND t.datetime = r.Maxdatetime 
WHERE t.uuid='bla' 
ORDER BY t.datetime desc 
+0

Dokładnie to, czego potrzebowałem przy niewielkich zmianach - dzięki! – mmrtnt

+0

Czy konieczne jest dwukrotne powtórzenie klauzuli WHERE? – ina

+0

@ina, tak ze względu na wydajność. –

4
SELECT * FROM 
(SELECT * FROM table WHERE uuid='bla' ORDER BY datetime desc) table 
GROUP BY version; 
2

Istnieje lepszy sposób dla mnie, można dodać desc do grupy przez:

SELECT * FROM tabela WHERE 'bla' GROUP UUID = Wersji desc

dlaczego to działa tak, ponieważ mój identyfikator generowane są i tak zawsze najnowsza id oznacza ostatnią datetime

+1

dlaczego nikt nie widzi tego ... to jest praca i proste zapytanie: D – haidarvm

+0

Przyjemnie, ale działa tylko, gdy 'datetime' został wstawiony w kolejności (posortowane) –