Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment puis-je améliorer cette requête pour éviter d'utiliser des vues imbriquées ?

Familiarisez-vous avec les données dont vous disposez :

La première chose clé est de comprendre quelles données vous avez. Ici dans ce cas, vous avez quatre tables

  • Compagnies d'assurance
  • Patient
  • Médecins
  • Visites

Votre objectif :

Retrouvez la liste de tous les patients ayant consulté tous les orthopédistes (spécialité) associés à leurs Compagnies d'Assurances.

Prenons du recul et analysons-le en petits morceaux :

Généralement, les exigences peuvent être un peu écrasantes lorsque vous les regardez dans leur ensemble. Séparons les exigences en composants plus petits pour comprendre ce que vous devez faire.

  1. Partie A : Vous devez trouver la liste des médecins dont la spécialité est 'Orthopédiste'
  2. Partie b : Retrouvez la liste des patients ayant consulté les médecins identifiés au #1.
  3. Partie c : Filtrez le résultat #2 pour trouver la liste des patients et des médecins qui partagent la même compagnie d'assurance.
  4. Partie d : Découvrez que les patients qui ont rendu visite à chacun de ces orthopédistes qui appartiennent à la même compagnie d'assurance que le patient.

Comment aborder :

  1. Vous devez identifier votre objectif principal, ici dans ce cas identifier la liste des patients. Donc, interrogez d'abord la table Patient.

  2. Vous avez les patients, en fait tous, mais nous devons trouver lesquels de ces patients ont rendu visite aux médecins. Ne nous soucions pas de savoir si le médecin est un orthopédiste ou non. Nous avons juste besoin de la liste des patients et des médecins qu'ils ont consultés. Il n'y a pas de mappage entre les tables Patient et Doctors. Pour connaître ces informations,

    Joindre la table Patient avec la table Visites sur le bon champ clé.

    Ensuite, joignez la sortie à la table Doctors sur le bon champ clé.

  3. Si vous avez bien fait la jointure, vous devriez maintenant avoir la liste de tous les patients et des médecins qu'ils ont consultés. Si vous avez utilisé LEFT OUTER JOIN , vous trouverez même les patients qui n'avaient jamais consulté un médecin. Si vous avez utilisé RIGHT OUTER JOIN , vous ne trouverez que les patients qui ont consulté un médecin.

  4. Maintenant, vous avez tous les patients et les médecins qu'ils ont visités. Cependant, l'exigence est de ne trouver que les médecins orthopédistes . Alors, appliquez la condition pour filtrer le résultat pour ne donner que le résultat souhaité.

  5. Vous avez maintenant atteint les exigences divisées en composants plus petits dans la partie a et partie b . Vous avez encore besoin de le filtrer par les compagnies d'assurance. Voici la partie délicate, l'exigence ne dit pas que vous devez afficher la compagnie d'assurance, nous n'avons donc pas besoin d'utiliser la table InsuranceCompanies. Votre prochaine question sera 'How am I going to filter the results?' . Point valide. Découvrez si l'une des trois tables Patient , Doctor et Visits contenir les informations de la compagnie d'assurance. Patient et Doctors ont un champ commun. Rejoignez ce champ commun pour filtrer le résultat.

  6. Trouver le nombre d'orthopédistes uniques que chaque patient a visité.

  7. Voici la partie qui peut être faite de plusieurs façons, l'une des façons de faire serait d'ajouter une sous-requête qui serait votre quatrième colonne dans la sortie. Cette sous-requête interrogerait la table Médecins et filtrerait par spécialité ='Orthopédiste'. En plus de ce filtre, vous devez également filtrer en faisant correspondre la compagnie d'assurance sur la table interne avec l'identifiant de la compagnie d'assurance sur la table Patients qui se trouve sur la requête principale. Cette sous-requête renverra le nombre de tous les orthopédistes pour l'identifiant de la compagnie d'assurance qui correspond aux données du patient.

  8. Vous devriez maintenant avoir les champs patient id , patient name , patients visits count et le total number of Orthopedists in same insurance company de la sous-requête. Vous pouvez ensuite ajouter une jointure externe qui filtrera les résultats de cette table dérivée sur les champs où patients visits count correspond au total number of Orthopedists in same insurance company . Je ne dis pas que c'est la meilleure approche. C'est une approche à laquelle je peux penser.

  9. Si vous suivez la logique ci-dessus, vous devriez avoir ceci.

Liste des patients qui ont visité tous les médecins

Filtré uniquement par les médecins, dont les orthopédistes

Filtré par les patients et les médecins partageant les mêmes informations sur la compagnie d'assurance.

Encore une fois, toute la sortie est ensuite filtrée par les deux champs de comptage trouvés dans la sortie de la table dérivée.

La balle est dans votre camp :

  • Essayez étape par étape et une fois que vous avez trouvé la réponse. Postez-le ici en tant que réponse séparée. Je vais le voter pour compenser tous les votes négatifs que vous avez obtenus sur cette question.

Je suis convaincu que vous pouvez le faire facilement.

Si vous trébuchez...

N'hésitez pas à poster vos questions en tant que comments to this answer , D'autres et moi serons heureux de vous aider.

Avis de non-responsabilité

J'ai fourni l'une des nombreuses façons dont cette logique peut être mise en œuvre. Je suis sûr qu'il existe de nombreuses façons de mettre cela en œuvre de manière bien meilleure.

Résultat :

Veuillez vous référer à la réponse de @Ofek Ron pour la requête correcte qui produit la sortie souhaitée. Je n'ai écrit aucune partie de la requête. C'était l'effort de tous les OP.