sql >> Databasteknik >  >> RDS >> Mysql

Hur kan jag förbättra den här frågan för att undvika att använda kapslade vyer?

Bekanta dig med den information du har:

Det första viktiga är att förstå vilken data du har. Här i det här fallet har du fyra bord

  • Försäkringsbolag
  • Patient
  • Läkare
  • Besök

Ditt mål:

Hitta listan över alla patienter som besökt alla ortopeder (specialiteter) associerade med deras försäkringsbolag.

Låt oss ta ett steg tillbaka och analysera det i mindre bitar:

Generellt sett kan kraven vara lite överväldigande när man ser dem på det hela taget. Låt oss dela upp kraven i mindre komponenter för att förstå vad du behöver göra.

  1. Del a: Du måste hitta listan över läkare vars specialitet är 'Ortoped'
  2. Del b: Hitta listan över patienter som besökte läkare som identifierats i #1.
  3. Del c: Filtrera resultatet #2 för att hitta listan över patienter och läkare som delar samma försäkringsbolag.
  4. Del d: Ta reda på att patienterna som besökte var och en av dessa Ortopeder som tillhör samma försäkringsbolag som patienten gör.

Hur man närmar sig:

  1. Du måste identifiera ditt huvudmål, här i det här fallet för att identifiera listan över patienter. Så fråga patienttabellen först.

  2. Du har patienterna, faktiskt alla men vi måste hitta vilka av dessa patienter som besökte läkarna. Låt oss inte oroa oss för om läkaren är en ortoped eller inte. Vi behöver bara listan över patienter och de läkare som de har besökt. Det finns ingen kartläggning mellan patient- och läkaretabellen. För att ta reda på denna information,

    Gå med i tabellen Patient med besök i rätt nyckelfält.

    Sätt sedan samman resultatet med tabellen Läkare på rätt nyckelfält.

  3. Om du har gjort anslutningen korrekt bör du nu ha en lista över alla patienter och läkare som de har besökt. Om du använde LEFT OUTER JOIN , hittar du även patienter som aldrig hade besökt en läkare. Om du använde RIGHT OUTER JOIN , hittar du bara de patienter som besökt en läkare.

  4. Nu har du alla patienter och läkare som de har besökt. Kravet är dock att endast hitta de läkare som är Ortopeder . Så använd villkoret för att filtrera resultatet för att bara ge det önskade resultatet.

  5. Du har nu uppnått kraven som delas upp i mindre komponenter i del a och del b . Du måste fortfarande filtrera det av försäkringsbolagen. Här är det knepiga, kravet säger inte att du behöver visa försäkringsbolaget, så vi behöver inte använda tabellen Försäkringsbolag. Din nästa fråga är 'How am I going to filter the results?' . Giltig punkt. Ta reda på om någon av de tre tabellerna Patient , Doctor och Visits innehålla försäkringsbolagsinformationen. Patient och Doctor har ett gemensamt område. Gå med i det gemensamma fältet för att filtrera resultatet.

  6. Hitta antalet unika ortopeder som varje patient har besökt.

  7. Här är den del som kan göras på många sätt, ett av sätten att göra detta skulle vara att lägga till en underfråga som skulle vara din fjärde kolumn i utdata. Denna underfråga skulle fråga tabellen Läkare och filtrera efter specialitet ='Ortoped'. Utöver det filtret måste du också filtrera genom att matcha försäkringsbolaget på den inre tabellen med försäkringsbolags-id i tabellen Patienter som finns på huvudfrågan. Denna underfråga kommer att returnera antalet ortopeder för försäkringsbolags-id som matchar patientens data.

  8. Du bör nu ha fälten patient id , patient name , patients visits count och det total number of Orthopedists in same insurance company från underfrågan. Du kan sedan lägga till en yttre sammanfogning som filtrerar resultaten från denna härledda tabell i fälten där patients visits count matchar med total number of Orthopedists in same insurance company . Jag säger inte att detta är det bästa tillvägagångssättet. Det här är ett tillvägagångssätt som jag kan tänka mig.

  9. Om du följer logiken ovan bör du ha detta.

Lista över patienter som har besökt alla läkare

Filtreras av endast läkare, vars är ortopeder

Filtreras av patienter och läkare som delar samma försäkringsbolagsinformation.

Återigen, hela utdata filtreras sedan av de två räknefälten som finns inuti den härledda tabellens utdata.

Bollen är på din plan:

  • Testa steg för steg och när du hittar svaret. Lägg upp det här som ett separat svar. Jag kommer att rösta upp det för att kompensera för alla nedröster som du fick på den här frågan.

Jag är övertygad om att du kan göra detta enkelt.

Om du snubblar...

Tveka inte att posta dina frågor som comments to this answer , andra och jag hjälper dig gärna.

Ansvarsfriskrivning

Jag har gett ett av många sätt hur denna logik kan implementeras. Jag är säker på att det finns många sätt att implementera detta på ett mycket bättre sätt.

Resultat:

Se @Ofek Rons svar för den korrekta frågan som ger önskad utdata. Jag skrev inte någon del av frågan. Det var hela OP:s ansträngning.



  1. omvandla tabellrader till kolumner i mysql

  2. Ansluter Visual c++ 2008 till MySql

  3. Varför är exekveringen långsam i Python MySQLdb?

  4. Hur skapar jag json-format med group-concat mysql?