sql >> Database >  >> RDS >> Mysql

Hoe kan ik deze query verbeteren om het gebruik van geneste weergaven te voorkomen?

Maak kennis met de gegevens die je hebt:

Het eerste belangrijke is om te begrijpen welke gegevens je hebt. In dit geval heb je vier tabellen

  • Verzekeringsmaatschappijen
  • Patiënt
  • Artsen
  • Bezoeken

Je doel:

Vind de lijst met alle patiënten die alle orthopedisten (specialiteiten) hebben bezocht die verbonden zijn aan hun verzekeringsmaatschappij.

Laten we een stap terug doen en het in kleinere stukjes analyseren:

Over het algemeen kunnen de vereisten een beetje overweldigend zijn als je ze in het algemeen bekijkt. Laten we de vereisten opsplitsen in kleinere componenten om te begrijpen wat u moet doen.

  1. Deel a: U moet de lijst met artsen vinden, wiens specialiteit 'Orthopedist' is
  2. Deel b: Zoek de lijst met patiënten die artsen hebben bezocht die zijn geïdentificeerd in #1.
  3. Deel c: Filter resultaat #2 om de lijst met patiënten en artsen te vinden die dezelfde verzekeringsmaatschappij delen.
  4. Deel d: Ontdek dat de patiënten die elk van die Orthopedisten hebben bezocht, die bij dezelfde verzekeringsmaatschappij horen als de patiënt.

Hoe te benaderen:

  1. U moet uw hoofddoel identificeren, in dit geval om de lijst met patiënten te identificeren. Vraag dus eerst naar de patiëntentabel.

  2. Je hebt de patiënten, eigenlijk allemaal, maar we moeten uitzoeken welke van deze patiënten de dokters hebben bezocht. Laten we ons geen zorgen maken of de dokter een orthopedist is of niet. We hebben alleen de lijst van patiënten nodig en de artsen die ze hebben bezocht. Er is geen toewijzing tussen de tabel Patiënt en Artsen. Om deze informatie te vinden,

    Doe mee aan de patiëntentabel met de tabel Bezoeken in het juiste sleutelveld.

    Voeg vervolgens de uitvoer samen met de tabel Dokters in het juiste sleutelveld.

  3. Als je de join correct hebt uitgevoerd, zou je nu de lijst moeten hebben van alle patiënten en de artsen die ze hebben bezocht. Als je LEFT OUTER JOIN . hebt gebruikt , vindt u zelfs de patiënten die nog nooit een arts hebben bezocht. Als je RIGHT OUTER JOIN . hebt gebruikt , vindt u alleen de patiënten die een arts hebben bezocht.

  4. Nu heb je alle patiënten en de artsen die ze hebben bezocht. De vereiste is echter om alleen de artsen te vinden die Orthopedist zijn . Pas dus de voorwaarde toe om het resultaat te filteren om alleen het gewenste resultaat te geven.

  5. U heeft nu de vereisten bereikt zoals opgesplitst in kleinere componenten in deel a en deel b . Je moet het nog steeds filteren op de verzekeringsmaatschappijen. Hier is het lastige deel, de vereiste zegt niet dat je de verzekeringsmaatschappij moet weergeven, dus we hoeven de tabel InsuranceCompanies niet te gebruiken. Uw volgende vraag is 'How am I going to filter the results?' . Geldig punt. Zoek uit of een van de drie tabellen Patient , Doctor en Visits de gegevens van de verzekeringsmaatschappij bevatten. Patient en Doctors een gemeenschappelijk veld hebben. Voeg je bij dat gemeenschappelijke veld om het resultaat te filteren.

  6. Vind het aantal unieke Orthopedisten die elke patiënt heeft bezocht.

  7. Hier is het deel dat op veel manieren kan worden gedaan, een van de manieren om dit te doen zou zijn om een ​​subquery toe te voegen die uw vierde kolom in de uitvoer zou zijn. Deze subquery zou de tabel Artsen opvragen en filteren op specialiteit ='Orthopedist'. Naast dat filter moet je ook filteren door de verzekeringsmaatschappij in de binnenste tabel te matchen met de verzekeringsmaatschappij-ID in de patiëntentabel die in de hoofdquery staat. Deze subquery retourneert de telling van alle orthopedisten voor de verzekeringsmaatschappij-ID die overeenkomt met de gegevens van de patiënt.

  8. U zou nu de velden patient id moeten hebben , patient name , patients visits count en het total number of Orthopedists in same insurance company uit de subquery. U kunt dan een outer join toevoegen die de resultaten uit deze afgeleide tabel filtert op de velden waar patients visits count komt overeen met total number of Orthopedists in same insurance company . Ik zeg niet dat dit de beste aanpak is. Dit is een benadering die ik kan bedenken.

  9. Als je de bovenstaande logica volgt, zou je dit moeten hebben.

Lijst van patiënten die alle artsen hebben bezocht

Gefilterd door alleen artsen die orthopedisch zijn

Gefilterd op patiënten en artsen die dezelfde informatie over de verzekeringsmaatschappij delen.

Nogmaals, de hele uitvoer wordt vervolgens gefilterd door de twee telvelden die in de afgeleide tabeluitvoer worden gevonden.

De bal ligt in jouw kamp:

  • Probeer het stap voor stap en zodra je het antwoord hebt gevonden. Post het hier als een apart antwoord. Ik zal het omhoog stemmen om alle negatieve stemmen die je op deze vraag hebt gekregen te compenseren.

Ik ben ervan overtuigd dat u dit gemakkelijk kunt doen.

Als je struikelt...

Aarzel niet om uw vragen te stellen als comments to this answer , Anderen en ik helpen u graag verder.

Disclaimer

Ik heb een van de vele manieren gegeven waarop deze logica kan worden geïmplementeerd. Ik weet zeker dat er veel manieren zijn om dit op een veel betere manier te implementeren.

Resultaat:

Raadpleeg het antwoord van @Ofek Ron voor de juiste vraag die de gewenste uitvoer oplevert. Ik heb geen enkel deel van de query geschreven. Het was allemaal de moeite van OP.



  1. hoe kan ik mysql-database exporteren met ssh?

  2. Nginx - PHP downloaden in plaats van uitvoeren

  3. Qt mysql-toepassing implementeren

  4. Hoe Atan2() werkt in PostgreSQL