Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL :Puis-je faire une jointure à gauche et extraire une seule ligne de la table de jointure ?

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 le s1.ticket_id = s2.ticket_id condition :il émule le GROUP BY ticket_id .

  • la condition s2.id > s1.id :c'est le SQL pour "Je ne veux que la dernière solution", il émule le MAX() . J'ai supposé que dans votre modèle, the last signifie with the greatest id mais vous pouvez utiliser ici une condition sur la date. Notez que s2.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))