sql >> Database teknologi >  >> RDS >> Mysql

Hvordan kan jeg forbedre denne forespørgsel for at undgå at bruge indlejrede visninger?

Gør dig bekendt med de data, du har:

Den første vigtige ting er at forstå, hvilke data du har. Her i dette tilfælde har du fire borde

  • Forsikringsselskaber
  • Patient
  • Læger
  • Besøg

Dit mål:

Find listen over alle de patienter, der besøgte alle ortopæder (speciale) tilknyttet deres forsikringsselskaber.

Lad os tage et skridt tilbage og analysere det i mindre stykker:

Generelt kan kravene være lidt overvældende, når man ser på dem i det hele taget. Lad os opdele kravene i mindre komponenter for at forstå, hvad du skal gøre.

  1. Del a: Du skal finde listen over læger, hvis speciale er 'Ortopæd'
  2. Del b: Find listen over patienter, der besøgte læger identificeret i #1.
  3. Del c: Filtrer resultatet #2 for at finde listen over patienter og læger, der deler det samme forsikringsselskab.
  4. Del d: Find ud af, at de patienter, der besøgte hver enkelt af disse Ortopæder der tilhører samme forsikringsselskab, som patienten gør.

Sådan griber du an:

  1. Du skal identificere dit hovedmål, her i dette tilfælde for at identificere listen over patienter. Så forespørg først patienttabellen.

  2. Du har patienterne, faktisk dem alle, men vi skal finde ud af, hvem af disse patienter, der besøgte lægerne. Lad os ikke bekymre os om, hvorvidt lægen er ortopæd eller ej. Vi mangler bare listen over patienter og de læger, de har besøgt. Der er ingen kortlægning mellem patient- og lægetabellen. For at finde ud af disse oplysninger,

    Tilslut dig tabellen Patient med besøg i det korrekte nøglefelt.

    Forbind derefter output med Læger-tabellen på det korrekte nøglefelt.

  3. Hvis du har lavet sammenkædningen korrekt, skal du nu have listen over alle patienter og læger, som de har besøgt. Hvis du brugte LEFT OUTER JOIN , vil du finde selv de patienter, der aldrig havde besøgt en læge. Hvis du brugte RIGHT OUTER JOIN , finder du kun de patienter, der har besøgt en læge.

  4. Nu har du alle patienterne og lægerne, som de har besøgt. Kravet er dog kun at finde de læger, der er Ortopæder . Så anvend betingelsen for at filtrere resultatet, så det kun giver det ønskede resultat.

  5. Du har nu opnået kravene som opdelt i mindre komponenter i del a og del b . Du skal stadig filtrere det af forsikringsselskaberne. Her er den vanskelige del, kravet siger ikke, at du skal vise forsikringsselskabet, så vi skal ikke bruge tabellen Forsikringsselskaber. Dit næste spørgsmål vil 'How am I going to filter the results?' . Gyldigt punkt. Find ud af, om nogen af ​​de tre tabeller Patient , Doctor og Visits indeholde forsikringsselskabets oplysninger. Patient og Doctors har et fælles felt. Deltag i det fælles felt for at filtrere resultatet.

  6. Find antallet af unikke Ortopæder som hver patient har besøgt.

  7. Her er den del, der kan gøres på mange måder, en af ​​måderne at gøre dette på ville være at tilføje en underforespørgsel, der ville være din fjerde kolonne i outputtet. Denne underforespørgsel ville forespørge i tabellen Læger og filtrere efter speciale ='Ortopæd'. Ud over det filter skal du også filtrere ved at matche forsikringsselskabet på den indre tabel med forsikringsselskabs-id'et på tabellen Patienter, der er på hovedforespørgslen. Denne underforespørgsel returnerer antallet af alle ortopæder for forsikringsselskabs-id, der matcher patientens data.

  8. Du skulle nu have felterne patient id , patient name , patients visits count og det total number of Orthopedists in same insurance company fra underforespørgslen. Du kan derefter tilføje en ydre joinforbindelse, der vil filtrere resultaterne fra denne afledte tabel på felterne, hvor patients visits count matcher med total number of Orthopedists in same insurance company . Jeg siger ikke, at dette er den bedste tilgang. Dette er en tilgang, jeg kan komme i tanke om.

  9. Hvis du følger ovenstående logik, burde du have dette.

Liste over patienter, der har besøgt alle lægerne

Filtreret af kun læger, hvis er ortopæder

Filtreret af patienter og læger, der deler de samme forsikringsselskabsoplysninger.

Igen filtreres hele outputtet af de to tællefelter, der findes inde i det afledte tabeloutput.

Bolden er på din bane:

  • Prøv det trin for trin, og når du har fundet svaret. Post det her som et separat svar. Jeg vil opstemme det for at kompensere for alle nedstemmer, du fik på dette spørgsmål.

Jeg er overbevist om, at du nemt kan gøre dette.

Hvis du snubler...

Tøv ikke med at sende dine spørgsmål som comments to this answer , Andre og jeg vil med glæde hjælpe dig.

Ansvarsfraskrivelse

Jeg har givet en af ​​de mange måder, hvordan denne logik kan implementeres. Jeg er sikker på, at der er mange måder at implementere dette på på en langt bedre måde.

Resultat:

Se venligst @Ofek Rons svar for den korrekte forespørgsel, der producerer det ønskede output. Jeg har ikke skrevet nogen del af forespørgslen. Det hele var OPs indsats.



  1. Flere udvalgte udsagn i enkelt forespørgsel

  2. MySQL:opdatering uden at ændre data, muligt?

  3. SQL Right Join

  4. Ønsker at gemme objekt i MySQL-database