Nel mio sistema, ho clienti. I clienti hanno programmi. Voglio visualizzare un elenco di client, mostrando il loro programma attivo più recente (se esiste).Ordine entro gruppo da?
Così, abbiamo qualcosa di simile:
SELECT *
FROM clients AS client
JOIN programs AS program ON client.id=program.client_id
GROUP BY client.id
ORDER BY program.close_date=0 DESC, program.close_date DESC
close_date=0
significa che il programma non è chiuso. Quindi metterà prima i programmi non chiusi e poi quelli chiusi più di recente.
Il problema è che l'ordine non funziona all'interno dei gruppi. È solo una specie di scegliere uno dei programmi a caso. Come posso risolvere questo?
appena arrivato fino a questo:
SELECT *
FROM clients AS client
JOIN (SELECT * FROM programs AS program ORDER BY program.close_date=0 DESC, program.close_date DESC) AS program ON client.id=program.client_id
GROUP BY client.id
che sembra dare risultati corretti. È corretto, o sto solo diventando fortunato? cioè, ho essenzialmente ordinato il tavolo prima di unirlo; quei risultati rimarranno ordinati come fa il join, giusto?
Soluzione: ora credo questo un classico group-wise maximum problema. Cercalo se sei bloccato su un problema simile. La soluzione prevede di unire due volte lo stesso tavolo.
L'ordine BY nella sottoselezione non dovrebbe avere alcun effetto deterministico sul risultato. Potrebbe succedere di lavorare con MySQL, ma lo standard SQL non lo consente nemmeno. Il punto chiave è ordinare il client.id nella principale (query esterna), quindi in qualsiasi altra colonna desiderata. Potresti dover dire le stesse cose nelle clausole GROUP BY e ORDER BY; non costa nulla per farlo. –
@Mark: Non penso che la tua soluzione alternativa (pubblicata sopra) possa garantire risultati corretti. Dopo che un 'GROUP BY' è stato eseguito su' client.id', ["il server è libero di scegliere qualsiasi record da ciascun gruppo"] (http://dev.mysql.com/doc/refman/5.0/en/group -da-nascosto-columns.html). – unutbu
@ubutbu: Grazie! Questo è esattamente quello che volevo sapere. Ero preoccupato che potesse essere il caso. – mpen