Maison > base de données > tutoriel mysql > Comment compter efficacement les résultats de plusieurs jointures de bases de données ?

Comment compter efficacement les résultats de plusieurs jointures de bases de données ?

Barbara Streisand
Libérer: 2024-12-08 16:11:10
original
189 Les gens l'ont consulté

How to Efficiently Count Results from Multiple Database Joins?

Comment obtenir le nombre de jointures multiples avec une efficacité optimale

Dans les requêtes de base de données, minimiser le nombre de jointures est crucial pour les performances. Cependant, il peut y avoir des scénarios dans lesquels il peut être tentant d'effectuer plusieurs jointures à la fois pour obtenir plusieurs décomptes. Explorons un exemple et discutons des stratégies d'optimisation.

Énoncé du problème

La tâche consiste à compter les lignes renvoyées par plusieurs jointures sur la même clé primaire. Une approche simple consiste à créer des sous-requêtes individuelles pour chaque jointure. Cependant, la question se pose : existe-t-il un moyen plus efficace d'obtenir le même résultat en utilisant une seule requête ?

Tentative initiale

Une approche consiste à tenter de compter le résultats de plusieurs jointures à l'aide d'instructions case, comme démontré ci-dessous :

select alb.titreAlb as "Titre",
sum(case when alb.idAlb=payalb.idAlb then 1 else 0 end) "Pays",
sum(case when alb.idAlb=peralb.idAlb then 1 else 0 end) "Personnages",
sum(case when alb.idAlb=juralb.idAlb then 1 else 0 end) "Jurons"
from album alb
left join pays_album payalb using ( idAlb )
left join pers_album peralb using ( idAlb )
left join juron_album juralb using ( idAlb )
where alb.titreAlb = "LES CIGARES DU PHARAON"
group by alb.titreAlb
Copier après la connexion

Cependant, cette méthode compte le nombre total de lignes dans toutes les tables jointes, ce qui entraîne dans des résultats incorrects.

Solution d'optimisation

Pour optimiser la requête et obtenir des décomptes séparés pour chaque jointure, vous pouvez exploiter DISTINCT dans une seule requête. Une clé unique est requise pour chaque table impliquée, et la colonne idalb doit être une clé unique pour la table album. La requête révisée est la suivante :

select alb.titreAlb as "Titre",
count(distinct payalb.idAlb, payalb.PrimaryKeyFields) "Pays",
count(distinct peralb.idAlb, peralb.PrimaryKeyFields) "Personnages",
count(distinct juralb.idAlb, juralb.PrimaryKeyFields) "Jurons"
from album alb
left join pays_album payalb using ( idAlb )
left join pers_album peralb using ( idAlb )
left join juron_album juralb using ( idAlb )
where alb.titreAlb = "LES CIGARES DU PHARAON"
group by alb.titreAlb
Copier après la connexion

Dans cette requête, distinct supprime les effets des autres jointures sur le décompte. Cependant, il est important de garder à l’esprit que distinct n’élimine pas nécessairement le coût des jointures. Si des index de couverture sont disponibles pour tous les champs (idAlb PrimaryKeyFields) des tables, cette approche pourrait donner une vitesse comparable à la solution d'origine, où chaque jointure était effectuée séparément. Néanmoins, tester avec EXPLAIN peut aider à déterminer la stratégie optimale.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal