2010-01-21 12 views
8

(Esta es la versión django del hilo en SQL join: selecting the last records in a one-to-many relationship)¿Cómo se puede hacer una consulta de "máximo n por grupo" en django?

Supongamos que tengo una tabla de clientes y una tabla de compras. Cada compra pertenece a un cliente. Quiero obtener una lista de todos los clientes junto con su última compra. ¿Se puede hacer sin SQL sin formato y sin múltiples consultas de bases de datos?

+0

posible duplicado de [Django consulta que obtienen la mayor parte Recientes objetos de diferentes categorías] (http://stackoverflow.com/questions/2074514/django -query-get-most-recent-objects-from-different-categories) – dbn

Respuesta

1
SELECT * 
FROM customers с 
LEFT JOIN 
     purchases p 
ON  p.id = 
     (
     SELECT id 
     FROM purchases pl 
     WHERE pl.customer = c.id 
     ORDER BY 
       pl.customer DESC, pl.date DESC 
     LIMIT 1 
     ) 

Asegúrese de que tiene un índice compuesto en purchases (customer, date) si la tabla es InnoDB, o en purchases (customer, date, id) si la tabla es MyISAM.

+0

¿Por qué no necesitamos identificación en el índice para InnoDB? – netvope

+0

'@ netvope': porque' InnoDB' está indexado e implícitamente contiene la 'PRIMARY KEY' como un puntero de fila en cada índice. – Quassnoi

3

No puede hacer esto en una consulta en Django. Se puede llegar al cliente con sólo la fecha de su compra más reciente de esta manera:

from django.db.models import Max 
customers = Customer.objects.annotate(Max('purchase__date')) 

pero no obtendrá automáticamente el acceso a la compra real de esta manera.

Cuestiones relacionadas