Je résume ce que j'ai compris :vous souhaitez sélectionner chaque ticket et sa dernière solution.
J'aime utiliser le modèle suivant pour ce type de question car il évite le modèle de sous-requête et est donc plutôt bon là où les performances sont nécessaires. L'inconvénient est qu'il est un peu difficile à comprendre :
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;
Je n'ai écrit que le cœur du motif pour une meilleure compréhension.
Les clés sont :
-
le LEFT JOIN des
solutions
table avec lui-même avec les1.ticket_id = s2.ticket_id
condition :il émule leGROUP BY ticket_id
. -
la condition
s2.id > s1.id
:c'est le SQL pour "Je ne veux que la dernière solution", il émule leMAX()
. J'ai supposé que dans votre modèle,the last
signifiewith the greatest id
mais vous pouvez utiliser ici une condition sur la date. Notez ques2.id < s1.id
vous donnerait la première solution. -
la clause WHERE
s2.id IS NULL
:le plus bizarre mais absolument nécessaire... ne garde que les enregistrements que vous voulez.
Essayez et tenez-moi au courant :)
Modification 1 : Je viens de réaliser que l'hypothèse du deuxième point simplifiait à l'extrême le problème. Cela le rend encore plus intéressant :p J'essaie de voir comment ce modèle peut fonctionner avec votre date, id
commande.
Modification 2 : Ok, ça marche très bien avec une petite torsion. La condition sur LEFT JOIN devient :
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))