Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak mogę ulepszyć to zapytanie, aby uniknąć używania widoków zagnieżdżonych?

Zapoznaj się z posiadanymi danymi:

Pierwszą kluczową rzeczą jest zrozumienie, jakie masz dane. W tym przypadku masz cztery stoły

  • Firmy ubezpieczeniowe
  • Pacjent
  • Lekarze
  • Odwiedziny

Twój cel:

Znajdź listę wszystkich pacjentów, którzy odwiedzili wszystkich ortopedów (specjalność) powiązanych z ich towarzystwami ubezpieczeniowymi.

Zróbmy krok wstecz i przeanalizujmy to w mniejszych kawałkach:

Ogólnie rzecz biorąc, wymagania mogą być nieco przytłaczające, gdy spojrzysz na nie w całości. Podzielmy wymagania na mniejsze komponenty, aby zrozumieć, co musisz zrobić.

  1. Część a: Musisz znaleźć listę lekarzy, których specjalnością jest „Ortopeda”
  2. Część b: Znajdź listę pacjentów, którzy odwiedzili lekarzy wskazanych w punkcie 1.
  3. Część c: Przefiltruj wynik nr 2, aby znaleźć listę pacjentów i lekarzy, którzy korzystają z tej samej firmy ubezpieczeniowej.
  4. Część d: Dowiedz się, że pacjenci, którzy odwiedzili każdego z tych ortopedów którzy należą do tej samej firmy ubezpieczeniowej co pacjent.

Jak podejść:

  1. Musisz określić swój główny cel, w tym przypadku zidentyfikować listę pacjentów. Dlatego najpierw odpytaj tabelę Pacjent.

  2. Masz pacjentów, właściwie wszystkich, ale musimy dowiedzieć się, który z tych pacjentów odwiedził lekarzy. Nie przejmujmy się tym, czy lekarz jest ortopedą, czy nie. Potrzebujemy tylko listy pacjentów i lekarzy, których odwiedzili. Nie ma mapowania między tabelą Pacjent i Lekarze. Aby uzyskać te informacje,

    Dołącz do tabeli Pacjent z tabelą Wizyty w odpowiednim polu kluczowym.

    Następnie połącz wyniki z tabelą Lekarze w odpowiednim polu klucza.

  3. Jeśli poprawnie wykonałeś połączenie, powinieneś mieć teraz listę wszystkich pacjentów i lekarzy, których odwiedzili. Jeśli użyłeś LEFT OUTER JOIN , znajdziesz nawet pacjentów, którzy nigdy nie byli u lekarza. Jeśli użyłeś RIGHT OUTER JOIN , znajdziesz tylko tych pacjentów, którzy odwiedzili lekarza.

  4. Teraz masz wszystkich pacjentów i lekarzy, których odwiedzili. Wymagane jest jednak znalezienie tylko lekarzy, którzy są ortopedami . Tak więc zastosuj warunek, aby odfiltrować wynik, aby uzyskać tylko żądany wynik.

  5. Udało Ci się spełnić wymagania podzielone na mniejsze komponenty w części a i część b . Nadal musisz to filtrować przez firmy ubezpieczeniowe. Oto trudna część, wymóg nie mówi, że musisz wyświetlić firmę ubezpieczeniową, więc nie musimy korzystać z tabeli InsuranceCompanies. Twoje następne pytanie będzie 'How am I going to filter the results?' . Prawidłowy punkt. Dowiedz się, czy którakolwiek z trzech tabel Patient , Doctor i Visits zawierać informacje o firmie ubezpieczeniowej. Patient i Doctors mają wspólne pole. Dołącz do tego wspólnego pola, aby filtrować wyniki.

  6. Znajdź liczbę unikalnych ortopedów którą odwiedził każdy pacjent.

  7. Oto część, którą można wykonać na wiele sposobów, jednym ze sposobów na zrobienie tego byłoby dodanie zapytania podrzędnego, które byłoby twoją czwartą kolumną w danych wyjściowych. To zapytanie podrzędne spowoduje zapytanie do tabeli Lekarze i filtrowanie według specjalizacji =„Ortopeda”. Oprócz tego filtru należy również filtrować, dopasowując firmę ubezpieczeniową w tabeli wewnętrznej do identyfikatora firmy ubezpieczeniowej w tabeli Pacjenci, która znajduje się w głównym zapytaniu. To podzapytanie zwróci liczbę wszystkich ortopedów dla identyfikatora firmy ubezpieczeniowej, który pasuje do danych pacjenta.

  8. Powinieneś teraz mieć pola patient id , patient name , patients visits count oraz total number of Orthopedists in same insurance company z podzapytania. Następnie możesz dodać sprzężenie zewnętrzne, które będzie filtrować wyniki z tej tabeli pochodnej na polach, w których patients visits count pasuje do total number of Orthopedists in same insurance company . Nie mówię, że to najlepsze podejście. To jest jedno podejście, które przychodzi mi do głowy.

  9. Jeśli postępujesz zgodnie z powyższą logiką, powinieneś to mieć.

Lista pacjentów, którzy odwiedzili wszystkich lekarzy

Filtrowane tylko przez lekarzy, którzy są ortopedami

Filtrowane według pacjentów i lekarzy dzielących się tymi samymi informacjami o firmie ubezpieczeniowej.

Ponownie, cały wynik jest następnie filtrowany przez dwa pola licznika znajdujące się w danych wyjściowych tabeli pochodnej.

Piłka jest na twoim boisku:

  • Wypróbuj krok po kroku, a gdy znajdziesz odpowiedź. Opublikuj to tutaj jako osobną odpowiedź. Poproszę go, aby zrekompensować wszystkie negatywne głosy, które otrzymałeś w tym pytaniu.

Jestem przekonany, że możesz to zrobić z łatwością.

Jeśli się potkniesz...

Nie wahaj się publikować swoich pytań jako comments to this answer , Inni i chętnie Ci pomożemy.

Zastrzeżenie

Przedstawiłem jeden z wielu sposobów implementacji tej logiki. Jestem pewien, że istnieje wiele sposobów na wdrożenie tego w znacznie lepszy sposób.

Wynik:

Proszę zapoznać się z odpowiedzią @Ofek Ron, aby uzyskać prawidłowe zapytanie, które daje pożądany wynik. Nie napisałem żadnej części zapytania. To wszystko było wysiłkiem OP.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wstaw format daty w dd/mm/rrrr przez laravel Eloquent Model

  2. mySQL konwertuje varchar na datę

  3. Limit MySQL z relacjami „wiele do wielu”

  4. Zmień tabelę za pomocą wyboru podrzędnego

  5. Dlaczego polecenie „wyjaśnij” daje różne wyniki przy tej samej instrukcji SQL?