In realtà, è possibile ottenere i project_ids in SQL. Supponendo che si desidera gli ID di progetto unici per i quattro progetti con le ultime voci di registro, SQL sarebbe simile a questa:
SELECT project_id, max(log.date) as max_date
FROM logs
GROUP BY project_id
ORDER BY max_date DESC LIMIT 4;
Ora, in realtà si vuole tutte le informazioni di log. In PostgreSQL 8.4 e versioni successive è possibile utilizzare le funzioni di windowing, ma che non funziona su altre versioni/basi di dati, quindi mi farlo nel modo più complesso:
SELECT logs.*
FROM logs JOIN (
SELECT project_id, max(log.date) as max_date
FROM logs
GROUP BY project_id
ORDER BY max_date DESC LIMIT 4) as latest
ON logs.project_id = latest.project_id
AND logs.date = latest.max_date;
Ora, se si dispone di accesso a funzioni di windowing, è un po 'più ordinato (credo comunque), e certamente più veloce da eseguire:
SELECT * FROM (
SELECT logs.field1, logs.field2, logs.field3, logs.date
rank() over (partition by project_id
order by "date" DESC) as dateorder
FROM logs) as logsort
WHERE dateorder = 1
ORDER BY logs.date DESC LIMIT 1;
OK, forse non è più facile da capire, ma prendere la mia parola per esso, viene eseguito mondi più veloce su un database di grandi dimensioni .
Non sono completamente sicuro di come ciò si traduca nella sintassi dell'oggetto, anche se lo fa. Inoltre, se si desidera ottenere altri dati di progetto, è necessario unirsi alla tabella dei progetti.
fonte
2011-12-02 21:10:12
Grazie per la risposta, unfortuatly ID_LIST = Log.objects.order_by ('- la data').. Values_list ('project_id') distinti() .. non funziona. Non risolve i distinti. Funziona se rimuovo order_by() nella catena, ma poi non è ordinato per data ... – mrmclovin
Ancora non funziona .. Nessun aiuto su questo? – mrmclovin
prova pk o usa la funzione reduce() di python –