Mysql
 sql >> база данни >  >> RDS >> Mysql

Как мога да подобря тази заявка, за да избегна използването на вложени изгледи?

Запознайте се с данните, с които разполагате:

Първото ключово нещо е да разберете какви данни разполагате. Тук в този случай имате четири таблици

  • Застрахователни компании
  • Пациент
  • Лекарите
  • Посещения

Вашата цел:

Намерете списъка на всички пациенти, посетили всички ортопеди (специалност), свързани с техните застрахователни компании.

Нека да направим крачка назад и да го анализираме на по-малки части:

Като цяло изискванията може да са малко непосилни, когато ги погледнете като цяло. Нека да разделим изискванията на по-малки компоненти, за да разберем какво трябва да направите.

  1. Част а: Трябва да намерите списъка на лекарите, чиято специалност е „Ортопед”
  2. Част б: Намерете списъка с пациенти, посетили лекари, посочени в #1.
  3. Част в: Филтрирайте резултата №2, за да намерите списъка с пациенти и лекари, които споделят една и съща застрахователна компания.
  4. Част г: Разберете, че пациентите, посетили всеки един от тези ортопеди които принадлежат към същата застрахователна компания като пациента.

Как да подходим:

  1. Трябва да определите основната си цел, тук в този случай да идентифицирате списъка с пациенти. Така че, първо потърсете таблицата на пациентите.

  2. Имате пациенти, всъщност всички, но трябва да намерим кой от тези пациенти е посетил лекарите. Нека не се притесняваме дали лекарят е ортопед или не. Нуждаем се само от списъка на пациентите и лекарите, които са посетили. Няма съпоставяне между таблицата на пациентите и лекарите. За да разберете тази информация,

    Присъединете се към таблицата на пациентите с таблицата за посещения в правилното ключово поле.

    След това съединете изхода с таблицата Doctors в правилното ключово поле.

  3. Ако сте направили присъединяването правилно, сега трябва да имате списък с всички пациенти и лекари, които са посетили. Ако сте използвали LEFT OUTER JOIN , ще намерите дори пациентите, които никога не са посещавали лекар. Ако сте използвали RIGHT OUTER JOIN , ще намерите само пациентите, които са посетили лекар.

  4. Сега имате всички пациенти и лекари, които са посетили. Изискването обаче е да се намерят само лекарите, които са ортопеди . Така че, приложете условието, за да филтрирате резултата, за да дадете само желания резултат.

  5. Вече постигнахте изискванията като разделени на по-малки компоненти в част а и част б . Все още трябва да го филтрирате от застрахователните компании. Тук е трудната част, изискването не казва, че трябва да покажете застрахователната компания, така че не е нужно да използваме таблицата InsuranceCompanies. Следващият ви въпрос ще бъде 'How am I going to filter the results?' . Валидна точка. Разберете дали някоя от трите таблици Patient , Doctor и Visits съдържа информация за застрахователната компания. Patient и Doctors имат общо поле. Присъединете се към това общо поле, за да филтрирате резултата.

  6. Намерете броя на уникалните ортопеди които всеки пациент е посетил.

  7. Ето частта, която може да се направи по много начини, един от начините да направите това е да добавите подзаявка, която ще бъде вашата четвърта колона в изхода. Тази подзаявка ще направи заявка в таблицата Лекари и ще филтрира по специалност ='Ортопед'. В допълнение към този филтър, вие също трябва да филтрирате, като съпоставите застрахователната компания във вътрешната таблица с идентификатора на застрахователната компания в таблицата на пациентите, която е в основната заявка. Тази подзаявка ще върне броя на всички ортопеди за застрахователна компания, който съвпада с данните на пациента.

  8. Вече трябва да имате полетата patient id , patient name , patients visits count и total number of Orthopedists in same insurance company от подзаявката. След това можете да добавите външно присъединяване, което ще филтрира резултатите от тази извлечена таблица в полетата, където patients visits count съвпада с total number of Orthopedists in same insurance company . Не казвам, че това е най-добрият подход. Това е един подход, за който се сещам.

  9. Ако следвате горната логика, трябва да имате това.

Списък на пациентите, които са посетили всички лекари

Филтрира се само от лекари, чиито ортопеди

Филтрирано от пациенти и лекари, споделящи една и съща информация за застрахователната компания.

Отново, целият изход след това се филтрира от двете полета за броене, намиращи се в изхода на извлечената таблица.

Топката е във вашето поле:

  • Опитайте стъпка по стъпка и след като намерите отговора. Публикувайте го тук като отделен отговор. Ще гласувам за него, за да компенсирам всички отрицателни гласове, които сте получили по този въпрос.

Уверен съм, че можете да направите това лесно.

Ако се спънете...

Не се колебайте да публикувате въпросите си като comments to this answer , Други и аз ще се радваме да ви помогнем.

Отказ от отговорност

Предоставих един от многото начини как тази логика може да бъде приложена. Сигурен съм, че има много начини да приложим това по далеч по-добър начин.

Резултат:

Моля, вижте отговора на @Ofek Ron за правилната заявка, която дава желания резултат. Не съм написал нито една част от заявката. Всичко беше усилие на 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. Как да рестартирате отдалечен MySQL сървър, работещ на Ubuntu linux?

  2. SQL заявка за изтриване на таблица в MySQL

  3. Групово вмъкване с mysql2 и NodeJs хвърля 500

  4. Как да получа първата дата на тримесечието в MySQL?

  5. PHP дата('W') срещу MySQL YEARWEEK(сега())