Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php/mysql]rozbudowane zapytanie, używanie kilku danych z róznych tabel
Forum PHP.pl > Forum > PHP
simo_n
Buduję sobie stronę www i mam problem. Nigdy nie robiłem trudnych, czy długich zapytań do bazy.

Chcę zrobić, żę łączy mi się z jedną tabelą, pobiera z niej kilka danych, wśród nich ID, ten numer przesyła do kolejnej tabeli, gdzie do przypisanego ID jest dodana odpowiednia zawartość w polu numerID, i z niej wyciąga odpowiednie dane. Następnie z pierwszej tabelki i z drugiej pobiera odpowiedni numerID (np. 10 i 11) oraz sprawdza w trzeciej tabelce, jakie dane są przyporządkowane tym numerom, i dopiero wtedy wyświetla wszystkie dane.

Budawa tabel:
Kod
Tabela 1
pr_tab1

--------------------------------------
|ID| NumerID| Tresc1| Tresc|
----------------------------------
|1 | 10  |Lol   | brak    |
|2 | 14     |xxx  | przyklad  
|3 | 10     |roftl | przyklad2 |
|4 | 57    |zip   | xxx        |
|5 | 35    |brak| i tak dalej  |
-------------------------------------

Tabela 2

ID | NumerID
1   | 15
2  |  14
3 |35
4 |57
5| 1

Tabela 3

NumerID | Nazwa
10  | Lol
35  | Adam
31  |  Polska
38  | Pilka
4   | Temat



Nie chcę gotowych skryptów, jedynie linki (najlepiej na polskie strony) oraz jakieś przykłady, a sam spróbuję to jakoś złożyć.


Szukałem na forum podobnych problemów, ale znalazłem wyłącznie z 2 tabel i bez takich problemów" jak moje.
Z góry dziękuje za pomoc/
legorek
Podaj struktury tabel i przykładowe dane, na sucho, ciężko cokolwiek poradzić.
PawelC
O ile się niemyle to poczytaj sobie o union all select z mysql, dzięki temu możesz pobierać dane z kilku tabel. Całkiem łatwo.
Tutaj masz coś o tym http://www.php.rk.edu.pl/w/p/pobieranie-rekordw/
A tak wygląda
Kod
SELECT pole FROM tabela UNION ALL SELECT pole FROM tabela
faster
jakie zależności są pomiędzy tymi tabelami. Opisz może co jest w jakiej tabeli bo wydaje mi się, że można to zrobić jednym zapytaniem łączącym

select * from tabela1 t1, tabela2 t2, tabela3 t3
where t1.id=t2.id
and t2.numerID=t3.numerID
and ..... tutaj podajesz dalsze ograniczenia

nie wiem tylko dlaczego numerID powtarza się we wszystkich 3 tabelach

można również użyć klauzuli left outer join jeżeli rekordy w tabeli 1 nie muszą mieć odpowiedników w tabelach 2 i 3
za mało napisałeś celem wyjaśnienia problemu

pozdro
PawelC
Numery id się powtarzają bo każda tabela ma osobne rekordy którym jest nadawany numer id

Cytat
jakie zależności są pomiędzy tymi tabelami. Opisz może co jest w jakiej tabeli bo wydaje mi się, że można to zrobić jednym zapytaniem łączącym

Bo można.
prosty przykład:
Kod
SELECT `imie`,`nazwisko` FROM autor UNION ALL SELECT `ksiazka`,`tytul` FROM ksiazki, UNION ALL SELECT `cena` from cennik itd
gdybym znał budowe Twojej bazy byłoby dużo łatwiej mi to opisać i pokazać gotowe polecenie.
simo_n
tabela 1" for1loxx

+----+-------------------------+
| ID_PM | ID_MEMBER_FROM |SUBJECT|BODY
+----+-------------------------+
| 1 | 1 | tylko raz wyciągana|tylko raz wyciągana
| 2 | 2 8 |tylko raz wyciągana|tylko raz wyciągana
| 3 | 45 |tylko raz wyciągana|tylko raz wyciągana
| 4 | 15 |tylko raz wyciągana|tylko raz wyciągana
+----+-------------------------+

Z tej tabeli pobiera dane, ID_PM przesyła do tabeli nr 2, natomiast ID_MEMBER_FROM przesyła do tabeli numer 3, do wartości ID_MEMBEr

tabela 2: for1loxx_x

+----+-------------------------+
| ID_PM | ID_MEMBER|
+----+-------------------------+
| 1 | 23 |
| 2 | 9 |
| 3 | 6 |
| 4 | 12 |
+----+-------------------------+

Tu znajdują się tylka dwi wartości, które chcę wyciągnąć/
Gdy zostanie przekazane ID_PM chcę, aby został wybrany przypisany numer ID_MEMBER, a następnie przesłany do tabeli 3

3 tabela: for1loxx_u
+----+-------------------------+
| ID_MEMBER | NAMe|
+----+-------------------------+
| 29 | LOL |
| 3 | ROFTL |
| 47| XXX|
| 18| WSAD |
+----+-------------------------+

Do każdego numeru ID_MEMBER ma wyświetlić nazwe NAME

Przy wyświetlaniu chcę, aby wyświetliło mi: subject i body( które mają przypisane wartośći, tekstowe)
, oraz numer ID_MEMBER odpowiednio dopasowane.
Zick4
Cytat
select * from tabela1 t1, tabela2 t2, tabela3 t3
where t1.id=t2.id
and t2.numerID=t3.numerID
and ..... tutaj podajesz dalsze ograniczenia

Jest pewna konwencja, że WHERE służy do wybierania wierszy, natomiast warunki łączenia podaje się gdzie indziej w klauzuli ON
  1. SELECT *
  2. FROM tabela1 t1 JOIN tabela2 t2 JOIN tabela3 t3 ON t1.id=t2.id AND t2.numerID=t3.numerID AND ..... tutaj podajesz dalsze ograniczenia

Albo lepiej według mnie
  1. SELECT *
  2. FROM tabela1 NATURAL JOIN tabela2 NATURAL JOIN tabela3

To "przekazywanie" stosuje się właśnie w taki sposób, że tabele łączy się jedna obok drugiej, no ale w taki sposób, aby sobie odpowiadały (tabelka1.id_pracownika = tabelka2.id_pracownika). Automatycznie zajmuje się tym natual join i ja własnie go stosuje jednak np. jeżeli mamy "warunki inne", które mają np. w postgresie musiałem zrobić
  1. tabelka1 JOIN tabelka2 ON tabelka1.plan_rok = date_part('year', tabelka2.wydatek_data) AND tabelka1.id_pracownika = tabelka2.id_pracownika

zamiast zwyklego NATURAL JOINa, bo one akurat sobie nie odpowiadały. I teraz utworzyliśmy jedną dłuuuuga tabelkę, no ale nie chcemy wszystkiego wyświetlać prawda? Więc SELECTem wybieramy tylko te kolumny, które nas interesują.
W Twoim wypadku będzie to:
  1. SELECT subject, body, ID_MEMBER
  2. FROM for1loxx NATURAL JOIN for1loxx_x NATURAL JOIN for1loxx_u

Swoją drogą może lepiej trochę nazywaj te tabelki, bo są nazwa niczego nie mówi. Mój znajomy jest jeszcze lepeszy i zmienne, tabelki i wszystko inne nazywa w, pw, wf itd. smile.gif
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.