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
solutions
tabella con se stesso cons1.ticket_id = s2.ticket_id
condizione: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 last
significawith the greatest id
ma potresti usare qui una condizione sulla data. Tieni presente ches2.id < s1.id
ti 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))