MySQL: Sélection des lignes avec la DateTime maximale pour chaque groupe
Ce guide montre comment récupérer efficacement les lignes contenant la valeur maximale de DateTime pour chaque groupe distinct dans une table MySQL. Il s'agit d'un défi SQL commun, impliquant souvent des sous-requêtes ou des fonctions de fenêtre.
Scénario:
Imaginez une table (TopTen
) Tracking Player Resource Utilisation à différentes maisons:
<code class="language-sql">CREATE TABLE TopTen ( id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, home INT UNSIGNED NOT NULL, datetime DATETIME NOT NULL, player VARCHAR(6) NOT NULL, resource INT NOT NULL );</code>
L'objectif est de trouver, pour chaque home
, le record avec la plus récente entrée (datetime
), y compris les informations player
et resource
de ce dernier enregistrement.
approches inefficaces (et pourquoi elles échouent):
Simple GROUP BY
et MAX()
ne fonctionnera pas directement, car GROUP BY
regroupe les données, perdant les colonnes non agrégées comme player
. Les tentatives d'utilisation des sous-requêtes pour trouver le DateTime maximum pour chaque maison, puis de rejoindre le tableau d'origine conduisent souvent à des résultats incorrects ou incomplets.
La solution efficace:
La solution la plus efficace exploite une auto-jointure avec une sous-requête:
<code class="language-sql">SELECT tt.* FROM TopTen tt INNER JOIN ( SELECT home, MAX(datetime) AS MaxDateTime FROM TopTen GROUP BY home ) groupedtt ON tt.home = groupedtt.home AND tt.datetime = groupedtt.MaxDateTime;</code>
Cette requête fonctionne par:
groupedtt
): Cette requête intérieure trouve le maximum datetime
pour chaque home
, regroupant les résultats par home
. TopTen
aliasée comme tt
) avec les résultats de la sous-requête. La condition JOIN
garantit que seules les lignes correspondant à la fois le home
et le maximum datetime
sont inclus dans le résultat final. Cette méthode garantit que toutes les colonnes de la table d'origine (y compris player
et resource
) sont renvoyées pour la ligne représentant le maximum datetime
pour chaque home
. Cela évite la perte de données et fournit les informations complètes requises.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!