Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php/mysql]rozbudowane zapytanie, używanie kilku danych z róznych tabel, oraz zamiana
simo_n
post 11.10.2007, 17:50:55
Post #1





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 9.09.2006

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


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/

Ten post edytował simo_n 11.10.2007, 18:38:12
Go to the top of the page
+Quote Post
legorek
post 11.10.2007, 18:23:12
Post #2





Grupa: Zarejestrowani
Postów: 411
Pomógł: 35
Dołączył: 27.06.2004
Skąd: Kraków

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


Podaj struktury tabel i przykładowe dane, na sucho, ciężko cokolwiek poradzić.


--------------------
Go to the top of the page
+Quote Post
PawelC
post 11.10.2007, 19:11:09
Post #3





Grupa: Zarejestrowani
Postów: 1 173
Pomógł: 121
Dołączył: 24.09.2007
Skąd: Toruń

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


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


Ten post edytował ExPlOiT 11.10.2007, 19:12:41
Go to the top of the page
+Quote Post
faster
post 11.10.2007, 20:32:09
Post #4





Grupa: Zarejestrowani
Postów: 49
Pomógł: 0
Dołączył: 9.09.2002
Skąd: Pszczyna

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


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

Ten post edytował faster 11.10.2007, 20:33:18
Go to the top of the page
+Quote Post
PawelC
post 11.10.2007, 20:55:42
Post #5





Grupa: Zarejestrowani
Postów: 1 173
Pomógł: 121
Dołączył: 24.09.2007
Skąd: Toruń

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


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.
Go to the top of the page
+Quote Post
simo_n
post 11.10.2007, 21:07:03
Post #6





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 9.09.2006

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


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.

Ten post edytował simo_n 11.10.2007, 21:10:06
Go to the top of the page
+Quote Post
Zick4
post 12.10.2007, 13:12:38
Post #7





Grupa: Zarejestrowani
Postów: 39
Pomógł: 0
Dołączył: 12.10.2007

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


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.06.2025 - 09:30