Maison > base de données > tutoriel mysql > Comment récupérer efficacement le dernier enregistrement dans des relations SQL un-à-plusieurs ?

Comment récupérer efficacement le dernier enregistrement dans des relations SQL un-à-plusieurs ?

DDD
Libérer: 2025-01-19 12:13:09
original
264 Les gens l'ont consulté

How to Efficiently Retrieve the Last Record in One-to-Many SQL Relationships?

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal