Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL]długo wykonujące się podzapytanie cz. 2
jacusek
post
Post #1





Grupa: Zarejestrowani
Postów: 262
Pomógł: 3
Dołączył: 18.10.2009
Skąd: Łódź

Ostrzeżenie: (0%)
-----


Witam.
2 dni temu walczyłem z jednym podzapytaniem i mi się udało. Niestety w momencie, kiedy dodaje drugie podzapytanie mysql bije wszelkie rekordy w długości zapytań
mam taką tabelę:
  1. CREATE TABLE `lek_pac` (
  2. `id_pow` INT(10) NOT NULL AUTO_INCREMENT,
  3. `id_pac` INT(3) NOT NULL,
  4. `id_lek` INT(3) NOT NULL,
  5. PRIMARY KEY (`id_pow`),
  6. INDEX `id_pac` (`id_pac`),
  7. INDEX `id_lek` (`id_lek`)
  8. )
  9. COLLATE='utf8_general_ci'
  10. ENGINE=MyISAM
  11. ROW_FORMAT=DEFAULT
  12. AUTO_INCREMENT=0

Łączącą pacjenta z lekarzem, który się nim opiekuje. Oczywiście może występować sytuacja, kiedy jeden pacjent "przypisany" jest do więcej niż jednego lekarza. Na to znalazłem sposób:
  1. SELECT id_pac,id_lek lekarz1,
  2. (SELECT id_lek FROM lek_pac WHERE id_lek !=(lekarz1) HAVING count(id_pac)>1) lekarz2
  3. FROM
  4. (SELECT * FROM lek_pac GROUP BY id_pac HAVING count(id_pac)>1) AS t2

Ale w momencie kiedy mam sytuację, ze jednej pacjent jest pod opieką więcej niż dwóch lekarzy wówczas zaczyna się problem. Idąc za taką logiką rozumowania zrobiłem następujące pytanie:
  1. SELECT id_pac,
  2. id_lek lekarz1,
  3. (SELECT id_lek FROM lek_pac WHERE id_lek !=(lekarz1) HAVING count(id_pac)>1) lekarz2,
  4. (SELECT id_lek FROM lek_pac WHERE id_lek NOT IN(lekarz1,lekarz2) HAVING count(id_pac)>1) lekarz3
  5. FROM
  6. (SELECT id_lek,id_pac FROM lek_pac GROUP BY id_pac HAVING count(id_pac)>1) AS t2

tutaj niestety już jest poważny problem, bo pytanie wykonuje się ponad 80 s. Oczywiście jest to niedopuszczalne. Zresztą nie było pożądanego efektu.
Kombinowałem z IFem, gdzie 4 kolumna miała wyglądać następująco
  1. (SELECT (IF(id_lek NOT IN(lekarz1,lekarz2),id_lek,NULL)) FROM lek_pac HAVING count(id_pac)>2) lekarz3

ale to też niestety na nic. Kiedy dodaje group by id_pac w tym podzapytaniu, pytanie wykonywało się w nieskończoność zresztą bezskutecznie.
Potrzebuję zrobić zapytanie gdzie będzie mi sprawdzał do 5 lekarzy u pacjentów.
Nie chodzi mi oczywiście o rozwiązanie tylko o pomoc gdzie można jeszcze szukać lub gdzie popełniam błąd w rozumowaniu
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
thek
post
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Dlatego tutaj zaleca sie rozsądek. Wiele osób upiera się, że wszystko ma być robione po stronie bazy jednym zapytaniem, bo to optymalniejsze (i czesto tak jest), ale sa sytuacje, gdy rozbicie na 2, 3 zapytania jest zwyczajnie lepsze, bo mocno upraszcza zapytanie i odciąża bazę. Zauważ jak bardzo uprościłem to zapytanie w porównaniu do Twojego z początkowego postu. Zamiast tworzyć multum kolumn, użyłem jednej i resztę zrzuciłem na skrypt PHP po stronie serwera. Tutaj właśnie liczy sie doświadczenie. trzeba wiedzieć, kiedy się wycofać z "oficjalnie uznanymi praktykami optymalizacyjnymi" (IMG:style_emoticons/default/smile.gif) Z czasem nauczysz się, kiedy powinno się łamać reguły by osiągnąć większe korzyści (mniejsze obciążenie, większa responsywnośc i szybkość aplikacji).
Go to the top of the page
+Quote Post

Posty w temacie


Closed TopicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 13.10.2025 - 18:24