Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Duże zapytanie problem z JOIN
Forum PHP.pl > Forum > Bazy danych > MySQL
bagsiur
Witam użyszkodników smile.gif

Mam mały problem ze stworzeniem zapytania które wyciągnie potrzebne mi dane z kilkunastu tabel. Z zapytaniem męczę się już dość długo wertując google, niestety sam nie potrafię rozwiązać problemu., dlatego liczę na waszą pomoc...

Moje tabele to:

  1. dokumenty_pdf
  2. identyfikatory
  3. p_bb
  4. p_fd
  5. p_k
  6. p_mnz
  7. p_nzoz
  8. p_wn
  9. p_xx
  10. w_bb
  11. w_fd
  12. w_mnz
  13. w_nzoz
  14. w_xx


Tabelka identyfikatory zawiera unikalny identyfikator (pole o nazwie identyfikator).

Tabela dokumenty_pdf zawiera nazwy dokumentów pdf oraz id_dokumentu do którego dany plik pdf należy. (pola to id_dokumentu, nazwa_pdf).

Pozostałe tabelki choć trochę różnią się konstrukcjami posiadają wspólne pola takie jak: identyfikator, kod, nadawca i adres.

Oczywiście elementem łączącym ma być sam identyfikator. Moim problemem jest wyciągniecie tych danych. Próbowałem już chyba wszystkich sposobów.

Teraz jestem na etapie takiego zapytania (które coś zwraca w przeciwieństwie do innych):

  1. SELECT identyfikatory.identyfikator,
  2. p_bb.kod, p_bb.nadawca, p_bb.adres,
  3. p_fd.kod, p_fd.nadawca, p_fd.adres,
  4. p_k.kod, p_k.nadawca, p_k.adres,
  5. p_mnz.kod, p_mnz.nadawca, p_mnz.adres,
  6. p_nzoz.kod, p_nzoz.nadawca, p_nzoz.adres,
  7. p_wn.kod, p_wn.nadawca, p_wn.adres,
  8. p_xx.kod, p_xx.nadawca, p_xx.adres,
  9. w_bb.kod, w_bb.nadawca, w_bb.adres,
  10. w_fd.kod, w_fd.nadawca, w_fd.adres,
  11. w_mnz.kod, w_mnz.nadawca, w_mnz.adres,
  12. w_nzoz.kod, w_nzoz.nadawca, w_nzoz.adres,
  13. w_xx.kod, w_xx.nadawca, w_xx.adres,
  14. dokumenty_pdf.nazwa_pdf
  15.  
  16. from identyfikatory
  17. LEFT OUTER JOIN p_bb ON identyfikatory.identyfikator = p_bb.id
  18. LEFT OUTER JOIN p_fd ON identyfikatory.identyfikator = p_fd.id
  19. LEFT OUTER JOIN p_k ON identyfikatory.identyfikator = p_k.id
  20. LEFT OUTER JOIN p_mnz ON identyfikatory.identyfikator = p_mnz.id
  21. LEFT OUTER JOIN p_nzoz ON identyfikatory.identyfikator = p_nzoz.id
  22. LEFT OUTER JOIN p_wn ON identyfikatory.identyfikator = p_wn.id
  23. LEFT OUTER JOIN p_xx ON identyfikatory.identyfikator = p_xx.id
  24.  
  25. LEFT OUTER JOIN w_bb ON identyfikatory.identyfikator = w_bb.id
  26. LEFT OUTER JOIN w_fd ON identyfikatory.identyfikator = w_fd.id
  27. LEFT OUTER JOIN w_mnz ON identyfikatory.identyfikator = w_mnz.id
  28. LEFT OUTER JOIN w_nzoz ON identyfikatory.identyfikator = w_nzoz.id
  29. LEFT OUTER JOIN w_xx ON identyfikatory.identyfikator = w_xx.id
  30. LEFT OUTER JOIN dokumenty_pdf ON identyfikatory.identyfikator = dokumenty_pdf.id_dokumentu


Mam nadzieję że udało mi się wszystko dobrze opisać. Z góry dziękuje za pomoc.
casI@
Możesz napisać co ci zwraca to zapytanie ? I jakiego wyniku oczekujesz w porównaniu do tego co ci zwraca ?
bagsiur
Chodzi mi wyciągnięcie identyfikatora z tabelki identyfikatory i podpięcie do niego dokumentu o takim samym identyfikatorze który może znajdować się w jednej z tabeli:

p_bb
p_fd
p_k
p_mnz
p_nzoz
p_wn
p_xx
w_bb
w_fd
w_mnz
w_nzoz
w_xx

Z tym że jak w identyfikatory.identyfikator = 1, to takie id może znajdować się tylko w jednej z wyżej wymienionych tabel. Kiedy np w tabelce p_bb id =1, to w innych tabelkach nie ma id o takim numerze.

Chcę też podpiąć dokument pdf z tabelki dokumenty_pdf (pole nazwa_zalacznika) gdzie każdy wpis posiada unikalne id tak aby połączyć je z określonym dokumentem.

Zapytanie zwraca tak jakby dobry wynik, tylko że wyświetla wszystkie pola z selecta na raz:

Chodzi mi konkretnie o uzyskanie czegoś takiego:

identyfikator|kod|nadawca|adres|nazwa_zalacznika|

I tak wszystkie rekordy (tyle ile jest identyfikatorów):

identyfikator|nazwa_zalacznika|kod|nadawca|adres|
1|nazwa_zalacznika|kod|nadawca|adres|
2|nazwa_zalacznika|kod|nadawca|adres|
3|nazwa_zalacznika|kod|nadawca|adres|
4|nazwa_zalacznika|kod|nadawca|adres|


A uzyskuję:

|identyfikator|kod|nadawca|adres|kod|nadawca|adres|kod|nadawca|adres|kod|nadawca
|adres|..(i tak ze wszystkich tabel)...|nazwa_zalacznika|

Wydaje mi się że brak mi jakichś instrukcji grupujących.
casI@
Ponieważ przy select wymieniłeś wszystkie pola które chcesz pobrać:
  1. SELECT identyfikatory.identyfikator,
  2. p_bb.kod, p_bb.nadawca, p_bb.adres,
  3. p_fd.kod, p_fd.nadawca, p_fd.adres,
  4. p_k.kod, p_k.nadawca, p_k.adres,
  5. p_mnz.kod, p_mnz.nadawca, p_mnz.adres,
  6. p_nzoz.kod, p_nzoz.nadawca, p_nzoz.adres,
  7. p_wn.kod, p_wn.nadawca, p_wn.adres,
  8. p_xx.kod, p_xx.nadawca, p_xx.adres,
  9. w_bb.kod, w_bb.nadawca, w_bb.adres,
  10. w_fd.kod, w_fd.nadawca, w_fd.adres,
  11. w_mnz.kod, w_mnz.nadawca, w_mnz.adres,
  12. w_nzoz.kod, w_nzoz.nadawca, w_nzoz.adres,
  13. w_xx.kod, w_xx.nadawca, w_xx.adres,
  14. dokumenty_pdf.nazwa_pdf

dlatego otrzymujesz wynik w postaci: |identyfikator|kod|nadawca|adres|kod|nadawca|adres|kod|nadawca|adres|kod|nadawca
|adres|..(i tak ze wszystkich tabel)...|nazwa_zalacznika|

Spróbuj może użyć IF'a lub CASE'a przy wybieraniu pól żeby sprawdzić które są puste i ich nie wyświetlać.
Poczytaj, tutaj też masz parę przykładów: http://dev.mysql.com/doc/refman/5.0/en/con...-functions.html
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.