sql >> Databáze >  >> RDS >> Mysql

Jak mohu zlepšit tento dotaz, abych se vyhnul použití vnořených zobrazení?

Seznamte se s daty, která máte:

První klíčovou věcí je pochopit, jaká data máte. Zde v tomto případě máte čtyři stoly

  • Pojišťovací společnosti
  • Pacient
  • Lékaři
  • Návštěvy

Váš cíl:

Najděte seznam všech pacientů, kteří navštívili všechny ortopedy (odbornost) sdružené v jejich pojišťovnách.

Udělejme krok zpět a analyzujme to po menších částech:

Obecně mohou být požadavky trochu ohromující, když se na ně podíváte jako celek. Rozdělme požadavky na menší součásti, abychom pochopili, co musíte udělat.

  1. Část a: Musíte najít seznam lékařů, jejichž specializací je 'Ortoped'
  2. Část b: Najděte seznam pacientů, kteří navštívili lékaře uvedené v #1.
  3. Část c: Filtrujte výsledek č. 2 a najděte seznam pacientů a lékařů, kteří sdílejí stejnou pojišťovnu.
  4. Část d: Zjistěte, že pacienti, kteří navštívili každého z těchto ortopedů kteří patří ke stejné pojišťovně jako pacient.

Jak přistupovat:

  1. Musíte určit svůj hlavní cíl, zde v tomto případě určit seznam pacientů. Nejprve se tedy zeptejte na tabulku pacientů.

  2. Máte pacienty, vlastně všechny, ale musíme zjistit, kteří z těchto pacientů navštívili lékaře. Netrapme se tím, zda je lékař ortoped nebo ne. Potřebujeme pouze seznam pacientů a lékařů, které navštívili. Mezi tabulkou Pacient a Doktor neexistuje žádné mapování. Chcete-li tyto informace zjistit,

    Připojte se k tabulce Pacient s tabulkou Návštěvy ve správném poli klíče.

    Potom spojte výstup s tabulkou Lékaři ve správném poli klíče.

  3. Pokud jste se připojili správně, měli byste nyní mít seznam všech pacientů a lékařů, které navštívili. Pokud jste použili LEFT OUTER JOIN , najdete i pacienty, kteří nikdy lékaře nenavštívili. Pokud jste použili RIGHT OUTER JOIN , najdete pouze pacienty, kteří navštívili lékaře.

  4. Nyní máte všechny pacienty a lékaře, které navštívili. Požadavkem však je najít pouze lékaře, kteří jsou ortopedy . Aplikujte tedy podmínku pro filtrování výsledku, abyste získali pouze požadovaný výsledek.

  5. Nyní jste splnili požadavky rozdělené na menší součásti v části a a část b . Musíte to ještě filtrovat podle pojišťoven. Zde je ošemetná část, požadavek neříká, že musíte zobrazit pojišťovnu, takže nemusíme používat tabulku Pojišťovny. Vaše další otázka bude 'How am I going to filter the results?' . Platný bod. Zjistěte, zda některá ze tří tabulek Patient , Doctor a Visits obsahovat informace o pojišťovně. Patient a Doctors mají společné pole. Připojte se k tomuto společnému poli a filtrujte výsledek.

  6. Najděte počet jedinečných ortopedů kterou každý pacient navštívil.

  7. Zde je část, kterou lze provést mnoha způsoby, jedním ze způsobů, jak toho dosáhnout, by bylo přidat dílčí dotaz, který by byl vaším čtvrtým sloupcem ve výstupu. Tento dílčí dotaz by se dotazoval na tabulku Lékaři a filtroval by podle specializace ='Ortoped'. Kromě tohoto filtru musíte také filtrovat porovnáním pojišťovny ve vnitřní tabulce s ID pojišťovny v tabulce Pacienti, která je v hlavním dotazu. Tento dílčí dotaz vrátí počet všech ortopedů na ID pojišťovny, které odpovídá údajům pacienta.

  8. Nyní byste měli mít pole patient id , patient name , patients visits count a total number of Orthopedists in same insurance company z dílčího dotazu. Poté můžete přidat vnější spojení, které bude filtrovat výsledky z této odvozené tabulky v polích, kde se patients visits count odpovídá total number of Orthopedists in same insurance company . Neříkám, že je to nejlepší přístup. To je jeden přístup, který mě napadá.

  9. Pokud se budete řídit výše uvedenou logikou, měli byste to mít.

Seznam pacientů, kteří navštívili všechny lékaře

Filtrováno pouze lékaři, kteří jsou ortopedy

Filtrováno podle pacientů a lékařů, kteří sdílejí stejné informace pojišťovny.

Celý výstup je pak opět filtrován podle dvou polí počtu nalezených uvnitř odvozeného tabulkového výstupu.

Míč je na vaší straně:

  • Vyzkoušejte to krok za krokem a jakmile najdete odpověď. Zveřejněte to zde jako samostatnou odpověď. Budu hlasovat pro, abych kompenzoval všechny záporné hlasy, které jste u této otázky dostali.

Jsem přesvědčen, že to snadno zvládnete.

Pokud klopýtnete...

Neváhejte zveřejnit své otázky jako comments to this answer , Ostatní a já vám rádi pomůžeme.

Odmítnutí odpovědnosti

Poskytl jsem jeden z mnoha způsobů, jak lze tuto logiku implementovat. Jsem si jistý, že existuje mnoho způsobů, jak to implementovat mnohem lépe.

Výsledek:

Správný dotaz, který produkuje požadovaný výstup, najdete v odpovědi @Ofek Ron. Nepsal jsem žádnou část dotazu. Všechno to bylo úsilí OP.



  1. chyba mysqldump:Mám paket větší než max_allowed_packet'

  2. Jak provést operaci obnovení při selhání pro nastavení replikace MySQL

  3. Problém s programem Java a připojením k MySQL:Nebyl nalezen žádný vhodný ovladač

  4. Dotaz na seznam počtu záznamů v každé tabulce v databázi