Récupération des enregistrements les plus récents dans des relations SQL un-à-plusieurs
Lorsque vous travaillez avec des relations de base de données un-à-plusieurs, la sélection efficace de l'enregistrement le plus récent pour chaque entité est une tâche courante. Par exemple, vous devrez peut-être afficher les clients et leurs derniers achats dans une seule requête.
Approche optimale
Une méthode robuste consiste à combiner JOIN
et LEFT OUTER JOIN
:
<code class="language-sql">SELECT c.*, p1.* FROM customer c JOIN purchase p1 ON (c.id = p1.customer_id) LEFT OUTER JOIN purchase p2 ON (c.id = p2.customer_id AND p1.date < p2.date OR (p1.date = p2.date AND p1.id < p2.id)) WHERE p2.customer_id IS NULL;</code>
Cette requête identifie p1
comme le dernier achat. Le LEFT OUTER JOIN
avec p2
recherche tout achat avec une date ultérieure ou, si les dates sont égales, un identifiant plus élevé (indiquant une entrée plus récente). Les lignes où p2.customer_id
est NULL
représentent le dernier achat de chaque client.
Indexation de base de données pour les performances
Créer un index composite sur la table purchase
à l'aide de colonnes (customer_id, date, id)
améliore considérablement les performances des requêtes. Cet index optimise les recherches et les jointures en fonction de ces critères.
Considérations sur la dénormalisation
Pour les scénarios complexes, la dénormalisation, c'est-à-dire l'ajout des détails du dernier achat directement au tableau customer
, peut être avantageuse. Cela simplifie les requêtes et améliore les performances pour des cas d'utilisation spécifiques. Cependant, pesez soigneusement les gains de performances par rapport aux problèmes potentiels d’intégrité des données et aux frais de maintenance.
Requête simplifiée pour les identifiants ordonnés séquentiellement
S'il est garanti que les identifiants d'achat sont classés séquentiellement par date, une requête simplifiée utilisant LIMIT
est possible :
<code class="language-sql">SELECT c.*, pu.* FROM customer c JOIN purchase pu ON (c.id = pu.customer_id) ORDER BY pu.id DESC LIMIT 1;</code>
Cette approche repose sur l'hypothèse que l'ID agit comme une séquence monotone au sein des achats de chaque client, permettant la récupération du dernier achat en fonction de l'ID le plus élevé. Cette méthode est moins robuste que la première approche si les séquences d'identification ne sont pas strictement classées par date.
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!