Riassumo quello che ho capito:vorresti selezionare ogni biglietto e la sua ultima soluzione.
Mi piace usare il seguente modello per questo tipo di domande in quanto evita il modello di sottoquery ed è quindi piuttosto buono dove sono necessarie prestazioni. Lo svantaggio è che è un po' complicato da capire:
SELECT
t.*,
s1.*
FROM tickets t
INNER JOIN solutions s1 ON t.id = s1.ticket_id
LEFT JOIN solutions s2 ON s1.ticket_id = s2.ticket_id AND s2.id > s1.id
WHERE s2.id IS NULL;
Ho scritto solo il cuore del modello per una migliore comprensione.
Le chiavi sono:
-
il LEFT JOIN delle
solutionstabella con se stesso cons1.ticket_id = s2.ticket_idcondizione:emula ilGROUP BY ticket_id. -
la condizione
s2.id > s1.id:è l'SQL per "Voglio solo l'ultima soluzione", emula ilMAX(). Ho pensato che nel tuo modello,the lastsignificawith the greatest idma potresti usare qui una condizione sulla data. Tieni presente ches2.id < s1.idti darebbe la prima soluzione. -
la clausola WHERE
s2.id IS NULL:il più strano ma assolutamente necessario... conserva solo i record che vuoi.
Fai una prova e fammi sapere :)
Modifica 1: Mi sono appena reso conto che l'ipotesi del secondo punto stava semplificando eccessivamente il problema. Questo lo rende ancora più interessante :p Sto cercando di vedere come questo modello potrebbe funzionare con il tuo date, id ordinazione.
Modifica 2: Ok, funziona benissimo con una piccola svolta. La condizione sul LEFT JOIN diventa:
LEFT JOIN solutions s2 ON s1.ticket_id = s2.ticket_id
AND (s2.date > s1.date OR (s2.date = s1.date AND s2.id > s1.id))