2011-01-14 2 views
5

tavolo: uuid, la versione, datetimeMySQL - Gruppo vicino con Ordina per DISC

versione non è unico, ma l'idea è quella di recuperare solo le righe con l'ultima datetime per un dato uuid

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

... ovviamente ottiene risultati di datetime asc - c'è un modo per "preordinare" il gruppo con desc, in modo che venga recuperata solo l'ultima versione?

risposta

21

dal momento che il tavolo ha solo quei 3 campo, e si sta filtrando dal uid si può semplicemente utilizzare il MAX senza il JOIN:

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

Tuttavia, se il tavolo aveva più campi, o non si è filtrando by uid - è necessario ottenere prima il datetime MAX per ogni versione, quindi selezionare la riga:

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

Esattamente quello che mi serviva con alcune lievi modifiche - Grazie! – mmrtnt

+0

È necessario che la clausola WHERE sia ripetuta due volte? – ina

+0

@ina, sì per motivi di prestazioni. –

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

C'è un modo migliore per me, si potrebbe aggiungere un desc al gruppo da:

SELECT * FROM tabella WHERE = uuid 'bla' GROUP BY versione disc

motivo per cui funziona è perché i miei id sono generati e così sempre l'ultima id intende l'ultima datetime

+1

perché nessuno vede questo ... è lavoro e semplice query: D – haidarvm

+0

Bello, ma funziona solo se 'datetime' è stato inserito nell'ordine (ordinato) –