2009-08-07 5 views
0

Je trouve que lorsque j'essaie de construire des jointures et des groupes MySQL complexes entre plusieurs tables, je rencontre souvent des difficultés et je dois passer beaucoup de temps à essayer et à faire des erreurs pour obtenir le résultat que je veux. Je me demandais comment d'autres personnes abordaient les problèmes. Isolez-vous les plus petits blocs de données à la fin des branches et commencez-vous par les utiliser? Ou commencez-vous avec ce que vous voulez retourner et commencez simplement à relier les tables lorsque vous en avez besoin?Meilleure approche pour construire des jointures et des groupes MySQL complexes?

Vous vous demandez également s'il existe de bons livres ou sites sur l'approche du problème.

Répondre

1

Je ne travaille pas dans mySQL mais je n'écrivent souvent SQL extrêmement complexe et voici comment je l'aborde. Tout d'abord, il n'y a pas de substitut pour comprendre parfaitement la structure de votre base de données.

Ensuite, j'essaie de décomposer la tâche en blocs. Par exemple, supposons que j'écrive un rapport concernant les détails d'une réunion (la société pour laquelle je travaille s'occupe de la planification des réunions). J'aurai besoin de connaître le nom de la réunion et le représentant des ventes, le lieu et les dates de la réunion, les personnes qui ont surveillé et les informations sur le conférencier.

D'abord, je détermine laquelle des tables aura l'information pour chaque champ dans le rapport. Maintenant, je sais ce que je vais devoir réunir, mais pas encore exactement comment.

Alors d'abord, j'écris une requête pour obtenir les réunions que je veux. C'est la base de tout le reste du rapport, alors je commence par là. Maintenant, le reste du rapport peut probablement être fait dans n'importe quel ordre, bien que je préfère travailler à travers les parties qui devraient avoir une relation en premier, alors je vais ajouter les jointures et les champs qui vont m'obtenir tous les représentants associés. information. Supposons que je ne souhaite qu'un seul représentant par réunion (s'il y a plusieurs représentants, je veux seulement le représentant principal), je vérifie que je retourne toujours le même nombre d'enregistrements que lorsque je disposais d'informations de réunion. . Si ce n'est pas le cas je regarde mes jointures et décide lequel me donne plus d'enregistrements que j'ai besoin. Dans ce cas, il peut s'agir de la table d'adresses car nous stockons plusieurs adresses pour le rep. Ensuite, j'ajuste la requête pour en obtenir une seule.Cela peut être facile (vous pouvez avoir un champ qui indique l'adresse unique spécifique que vous voulez et donc seulement besoin d'ajouter une condition où) ou vous devrez peut-être faire quelques fonctions de regroupement et d'agrégation pour obtenir ce que vous voulez.

Puis je passe au segment suivant (en travaillant d'abord à travers tous les morceaux qui devraient avoir un 1-1 relationshisp aux données centrales dans ce cas la réunion). Runthe requête nd vérifier les données après chaque ajout.

Enfin, je passe à ces enregistrements qui pourraient avoir une relation un-plusieurs et les ajouter. Encore une fois, je lance la requête et vérifie les données. Par exemple, je pourrais vérifier les données brutes pour une réunion particulière et m'assurer que ce que ma requête renvoie est exactement ce que je m'attends à voir. Supposons que dans un de ces ajouts d'une jointure, le nombre de réunions distinctes ait diminué. Oups, alors il n'y a pas de données dans l'une des tables que je viens d'ajouter et je dois changer cela pour une jointure à gauche.

Une autre fois, je peux trouver trop d'enregistrements retournés. Ensuite, je cherche à voir si ma clause where doit avoir plus d'informations de filtrage ou si j'ai besoin d'utiliser une fonction aggreagte pour obtenir les données dont j'ai besoin. Parfois, j'ajouterai temporairement d'autres champs au rapport pour voir si je peux voir ce qui cause les données dupliquées. Cela m'aide à savoir ce qui doit être ajusté. La vraie clé est de travailler lentement, de comprendre votre modèle de données et de vérifier les données après chaque ajout de nouveau morceau pour s'assurer qu'il renvoie les résultats comme vous le pensez.

Parfois, si je retourne beaucoup de données, je mettrai temporairement une clause additonal where sur la requête pour la limiter à quelques éléments que je peux facilement vérifier. Je suggère également fortement l'utilisation de l'ordre par, car il vous aidera à voir si vous obtenez des enregistrements en double.

+0

Merci d'avoir partagé votre approche. C'est bien. :) – Das123

0

Je ne les ai pas utilisés moi-même donc je ne peux pas commenter leur efficacité, mais peut-être un constructeur de requête basé sur une interface graphique comme dbForge ou Code Factory pourrait aider? Et bien que l'utilisation de diagrammes de Venn pour penser aux jointures MySQL n'aide pas forcément le SQL, ils peuvent aider à visualiser les données que vous essayez de récupérer (voir Jeff Atwood's post).

1

Bien la meilleure approche pour décomposer votre requête MySQL est d'exécuter la commande EXPLAIN ainsi que la documentation de MySQL pour la commande Optimization with the EXPLAIN. MySQL fournit également de bonnes options gratuites: GUI tools, MySQL Query Browser est ce que vous devez utiliser.

Lors de l'exécution de la commande EXPLAIN, la manière dont MySQL interprète votre requête et affiche la complexité est décomposée. Il pourrait prendre un certain temps pour décoder la sortie, mais c'est une autre question en soi.

Comme un bon livre que je recommande: High Performance MySQL: Optimization, Backups, Replication, and More

Questions connexes