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




W takiej sytuacji widzę, że mamy tabelę n-n... Teraz musimy określić CO chcesz z tego złączenia wyciągnąć. Jeśli tylko id lekarzy, to kombinujesz jak koń pod górkę (IMG:style_emoticons/default/smile.gif) Najprościej wtedy wziąć tabelę łaczącą lek_pac i złaczyć ją z tabelą lekarzy oraz użyć GROUP BY id_pac a w części select to co nas interesuje pobrać do kolumny w której uzyjemy GROUP_CONCAT na tym co chcemy.

EDIT: W zasadzie jeśli pokombinujesz chwilkę, to używając GROUP_CONCAT i konkatenacji stringów, możesz w ten sposób jednym zapytaniem wyciągnąc co chcesz.. Zarówno dane pacjenta, jak i dane jego lekarzy... Dla całej bazy (IMG:style_emoticons/default/smile.gif)
Wtedy łącząca będzie bazą główną i zrobisz join na pacjentów, potem join na lekarzy, całość pogrupować po pacjentach, a do tego ładnie w select group_concat. Powinna całość drastycznie przyspieszyć jeśli jeszcze masz sensowne indeksy.

PS... I bonusem... int(3) nie oznacza, że to pole jest 3-cyfrowe czyli od 0 do 999. Ale co oznacza to już sam się dowiedz.
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: 8.10.2025 - 21:44