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
solutionstable avec lui-même avec les1.ticket_id = s2.ticket_idcondition :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 lastsignifiewith the greatest idmais vous pouvez utiliser ici une condition sur la date. Notez ques2.id < s1.idvous 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))