Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Dane Z 2 Tabel Naraz, skad wiedziec z ktorej sa dane?
Nookie
post 22.08.2004, 11:53:14
Post #1





Grupa: Zarejestrowani
Postów: 56
Pomógł: 0
Dołączył: 15.09.2003

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


Witam

mam pytanko mam przykladowo 2 tabele

samochody_osobowe:
id| rok_produkcji | pojemnosc | opis


samochody_ciezarowe:
id| rok_produkcji | pojemnosc | opis


i teraz przykladowo chce wystwietlic wszystkie auta ktore sa mlodsze niz 1990 rok
wiec daje zapytanie
  1. $query = "select * FROM samochody_osobowe, samochody_ciezarowe where rok_produkcji > '1990'";
  2. $dane = mysql_db_query($database_name, $query) OR die("Select Failed! ($query)");


chcialbym to teraz przedstawic jako tabela, ale z dodatkowa kolumna w ktorej bedzie typ samochodu (ciezarowy lub osobowy) jak mam sprawdzic z ktorej tabeli jest dany rekord ktory trafaia do tabeli ?


dzieki za info

Ten post edytował Nookie 22.08.2004, 11:54:08
Go to the top of the page
+Quote Post
Parti
post 22.08.2004, 19:18:33
Post #2





Grupa: Zarejestrowani
Postów: 116
Pomógł: 0
Dołączył: 22.07.2004

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


Pierwsza sprawa: jeśli jesteś wciąż na etapie projektowania swojej bazy, to proponowałbym wszystko trzymać w jednej tabeli "samochody". Wystarczy, że dodasz jedną kolumne "typ", w której będziesz zapisywał, czy to jest samochód osobowy, ciężarowy czy jeszcze jakiś inny.

Jeśli jednak nie możesz już zmienić bazy danych, to:
  1. (SELECT * FROM samochody_osobowe WHERE rok_produkcji > 1990)
  2. UNION
  3. (SELECT * FROM samochody_ciezarowe WHERE rok_produkcji > 1990)
Go to the top of the page
+Quote Post
Nookie
post 23.08.2004, 17:09:17
Post #3





Grupa: Zarejestrowani
Postów: 56
Pomógł: 0
Dołączył: 15.09.2003

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


Witam,

zmienic bazy nie moge, to co podalem to przyklad w ktorym ukazany jest probelm, a nie musialbym za duzo tlumaczyc smile.gif

ja mam takich tabel 8 smile.gif

i problem w tym ze na podstawie danych z nich musze zbudowac nazwijmy to raport ktory bedzie tabelka..

dlatego musze pobrac dane z wszystkich tabel i zaleznie z ktorej beda dane, musi byc kolumna typ samochodu (z przykadlu)

co do Twojej odpowiedzi moglbys troche rozwinac/wyjasnic ?

pokazac dokladniej o co chodzi ? bo nie rozumiem tego dodania union ?

jak by wygladalo cale zapytanie plus pobranie danych ?

plus pytanie bo ile rozumiem union pozwala mi laczyc zapytania do jednego wyniku, skad potem mam wiedziec ktore dane za z ktorej tabeli ?

dzieki za info

Ten post edytował Nookie 23.08.2004, 17:12:55
Go to the top of the page
+Quote Post
Parti
post 24.08.2004, 07:59:53
Post #4





Grupa: Zarejestrowani
Postów: 116
Pomógł: 0
Dołączył: 22.07.2004

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


Po pierwsze poczytaj w dokumentacji o union

W skrócie union "skleja" wyniki z dwóch lub więcej zapytań w jedną całość.

Cytat
skad potem mam wiedziec ktore dane za z ktorej tabeli ?

Możesz to zrobić np. tak:
  1. (SELECT *, 'osobowy' FROM samochody_osobowe WHERE rok_produkcji > 1990)
  2. UNION
  3. (SELECT *, 'ciezarowy' FROM samochody_ciezarowe WHERE rok_produkcji > 1990)

Cytat
jak by wygladalo cale zapytanie plus pobranie danych ?

Zapytanie masz powyżej, a pobranie dokładnie tak samo jak w przypadku innych zapytań.
  1. <?php
  2. $res = mysql_query($query) or die(mysql_error());
  3. while ($row = mysql_fetch_array($res)) ...
  4. ?>


Ps. Union dostępne jest od MySQL 4.x
Go to the top of the page
+Quote Post
cim
post 24.08.2004, 08:22:49
Post #5





Grupa: Zarejestrowani
Postów: 208
Pomógł: 28
Dołączył: 9.08.2004
Skąd: Stargard

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


Możesz spróbować tak:

  1. SELECT * FROM samochody_osobowe AS osob, samochody_ciezarowe AS ciezar WHERE osob.rok_produkcji > '1990' AND ciezar.rok_produkcji > '1990'


Ten post edytował cim 24.08.2004, 08:23:08


--------------------
errare humanum est
Go to the top of the page
+Quote Post
Parti
post 24.08.2004, 08:47:34
Post #6





Grupa: Zarejestrowani
Postów: 116
Pomógł: 0
Dołączył: 22.07.2004

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


Cytat(cim @ 2004-08-24 09:22:49)
Możesz spróbować tak:

  1. SELECT * FROM samochody_osobowe AS osob, samochody_ciezarowe AS ciezar WHERE osob.rok_produkcji > '1990' AND ciezar.rok_produkcji > '1990'

To nie jest dobre rozwiązanie, bo uzyskasz iloczyn kartezjański dwóch tabel zamiast sumy.
Go to the top of the page
+Quote Post
Nookie
post 24.08.2004, 20:43:41
Post #7





Grupa: Zarejestrowani
Postów: 56
Pomógł: 0
Dołączył: 15.09.2003

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


Mam kolejne pytanie troche juz z innej poleczki...


jesli mam te tabele

osobowey i ciezarowe

i teraz kazde z nich zawiera kolumny

id, nazwa, marka

(ktore sie dubluja)

jak pozniej pobrac dane z dwoch tabel naraz zeby mozna wyswietlac te pola questionmark.gif

gdy robie
  1. SELECT * FROM osobowe, ciezarowe WHERE rok_produkcji > '1990'



a pozniej staram sie pobrac dane poprzez
  1. <?php
  2.  while ($row = mysql_fetch_array($result))
  3. {
  4.  
  5. echo &#092;"$row[id]  $row[nazwa] $row[marka]\";
  6.  
  7. }
  8. ?>


jesli robie zapytanie do dwoch tabel i nazwy kolumn mi sie dubluja mam problem pozniej z pokazaniem tych danych.. jak to rozwiazac questionmark.gif

dzieki za info

}
Go to the top of the page
+Quote Post
Vertical
post 25.08.2004, 19:23:18
Post #8





Grupa: Zarejestrowani
Postów: 848
Pomógł: 0
Dołączył: 7.07.2004
Skąd: Wrocław

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


MI NARG! Po pierwsze to nie
  1. <?php
  2. $row[id];
  3. ?>

Tylko:
  1. <?php
  2. $row['id'];
  3. ?>

A poza tym, załóżmy, że masz dwie tabele: a i b. w nich masz dane: id, tytul, tresc. I chcesz wybrać, czy id, tytul lub tresc ma pobrać z a albo b. Wtedy piszesz cuś takiego (jeżeli chcesz, żeby pobrało id z tabeli a):
  1. SELECT * FROM a, b WHERE a.id = '[cos]'

Jeśli natomiast chciałbyś pobrać id z tabeli b, piszesz:
  1. SELECT * FROM a, b WHERE b.id = '[cos]'

Podsumowyjąc, wpisujesz najpierw nazwę tabeli, a po kropce dane z tabeli.
cool.gif
Go to the top of the page
+Quote Post
Nookie
post 25.08.2004, 22:13:52
Post #9





Grupa: Zarejestrowani
Postów: 56
Pomógł: 0
Dołączył: 15.09.2003

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


Vertical, to to wiem, ze jak z danej tabeli chce wybrac warunek dl apola to wpisuje go po kropce , czyli korzystajac z przykladu
  1. SELECT * FROM osobowe, ciezarowe WHERE osobowe.id = '1'



ale nie o to biega...


chodzi o to ze mam przykladowo dwie tabele...

osobowe:
id | nazwa | marka | pojemosc | rok_produkcji | liczba_osob

ciezarowe:
id | nazwa | marka | pojemosc | rok_produkcji | pojemnosc

i teraz chce pokazac wszystkie auta z dostepnych ktorych rok produkcji jest wiekszy niz 1990

robie takie zapytanie:
  1. SELECT * FROM osobowe, ciezarowe WHERE osobowe.rok_produkcji > '1990' AND ciezarowe.rok_produkcji > '1990'



Problem mam tylko z wyswietleniem tego w postaci tabeli, gdyz czesc nazw kolumn sie dubluje, jak id, rok produkcji itp.. a czesc oczywiscie sie rozni..
i jak teraz wyswietlic to wszystko(pobrac ?) zebym mogl
to przedstawic korzystajac ze zwyklego

mysql_fertch_array()
i potem w petli while sobie plul danymi
  1. <?php
  2.  echo &#092;"$row[id] $row[marka] $row[rok_produkcji]\";
  3. ?>


czy istnieje cos w stylu echo $row[osobowe.id] ?
bo jak zadam pytanie takie jak wyzej.. to potem nazwy pol ktore sie powtarzaja nie sa wypluwane lub brane tylko raz(przy pierwszym ich napotkaniu) .. i wychodza jakies bezsensy ?

Pliiz HELp bo juz nie mam na to pomyslu ?

dzieki
Go to the top of the page
+Quote Post
Parti
post 26.08.2004, 07:42:36
Post #10





Grupa: Zarejestrowani
Postów: 116
Pomógł: 0
Dołączył: 22.07.2004

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


Cytat(Nookie @ 2004-08-25 23:13:52)
czy istnieje cos w stylu echo $row[osobowe.id] ?

Zdaje się, że nie a przynajmniej nie wiem jak.

Masz dwie opcje. Pierwsza: skorzystaj z mysql_fetch_row() i odwołuj się po numerach kolumn $row[0], $row[1] itd. Druga to:
  1. SELECT osobowe.id AS id_osob, ciezarowe.id AS id_ciez ... FROM osobowe, ciezarowe ...

Musisz wypisać wszystkie nazwy kolumn. Odwołujesz się: $row['id_osob']

Drugie rozwiązanie jest zdecydowanie lepsze.

Ten post edytował Parti 26.08.2004, 07:45:11
Go to the top of the page
+Quote Post
ActivePlayer
post 26.08.2004, 09:11:43
Post #11





Grupa: Przyjaciele php.pl
Postów: 1 224
Pomógł: 40
Dołączył: 6.07.2004
Skąd: Wuppertal

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


a nie powinno byc tak ?
  1. SELECT * FROM osobowe, ciezarowe WHERE osobowe.rok_produkcji > '1990' OR ciezarowe.rok_produkcji > '1990'


Jak juz ktos pisał to zapytanie jakos zle sie chyba wykona...
A nawet jesli dobrze to warto w fazie testów użyc print_r" title="Zobacz w manualu PHP" target="_manual wtedy dokladnie widac co i jak.
Go to the top of the page
+Quote Post
Vertical
post 26.08.2004, 13:37:41
Post #12





Grupa: Zarejestrowani
Postów: 848
Pomógł: 0
Dołączył: 7.07.2004
Skąd: Wrocław

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


Chyba nie, bo wtedy wyświetliłby wszystkie, które są powyżej i poniżej 1990 bez 1990. Spróbuj tak:
  1. <?php
  2. $sql = &#092;"select * from osobowe where rok_produkcji > '1990'\";
  3. $result = mysql_query($sql);
  4. while ($row = mysql_fetch_array($result)) {
  5. printf(&#092;"%sn\",
  6. $row[&#092;"id\"]);
  7. printf(&#092;"%sn\",
  8. $row[&#092;"rok\"]);
  9. //Itp, itd.
  10. $sql = &#092;"select * from ciezarowe where rok_produkcji > '1990'\";
  11. $result = mysql_query($sql);
  12. while ($row = mysql_fetch_array($result)) {
  13. printf(&#092;"%sn\",
  14. $row[&#092;"id\"]);
  15. printf(&#092;"%sn\",
  16. $row[&#092;"rok\"]);
  17. //Itp, itd.
  18.  
  19. ?>

cool.gif

Ten post edytował Vertical 26.08.2004, 13:41:31
Go to the top of the page
+Quote Post
Nookie
post 26.08.2004, 15:09:12
Post #13





Grupa: Zarejestrowani
Postów: 56
Pomógł: 0
Dołączył: 15.09.2003

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


Witam, powinno byc "or": pomiedzy warunkami
ale to nie ma dluzego znaczenia..

zapytanie jest przykladowe bo ma tylko pokazac w czym rzecz...

niestety tabele sa tez przykladowe.. i mam dokladnie taki sam problem tylko na 8 tabelach..

jedyne rozwiazanie jest takie jak podal Parti..
myslalem ze moze idzie wymyslic cos innego.. zwlaszcza ze przy rzeczywistym problemie.. mam jeszcze ogromna ilosc warunkow do spelnienia...

  1. SELECT osobowe.id AS id_osob, ciezarowe.id AS id_ciez ... FROM osobowe, ciezarowe ...


Vertical, w Twojej odpowiedz wyciagasz dane po koleji z tabel.. a to nie o to biega smile.gif

choc moze to bedzie latwiejsze rozwiazanie problemu..


dzieki za podpowiedz!
Go to the top of the page
+Quote Post
Parti
post 26.08.2004, 19:17:15
Post #14





Grupa: Zarejestrowani
Postów: 116
Pomógł: 0
Dołączył: 22.07.2004

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


Cytat(Nookie @ 2004-08-26 16:09:12)
Vertical, w Twojej odpowiedz wyciagasz dane po koleji z tabel.. a to nie o to biega smile.gif

Z czystej ciekawości pytam: jesteś pewien, że zapytanie w stylu:
  1. SELECT ... FROM ciezarowe, osobowe
daje w wyniku to co potrzebujesz? A jeśli tak, to dlaczego? Bardzo mnie to ciekawi. Jeśli dla przykładu w bazie masz 80 samochodów osobowych i 50 ciężarowych to w wyniku uzyskasz 80*50 = 4000 rekordów. Mówisz, że masz 8 tabel. Niech każda ma tylko po 10 rekordów, to iloczyn kartezjański tych tabel da 10^8 = 100 milionów rekordów. Jeśli nie ma żadnych relacji między tymi tabelami, to coś tu zdecydowanie jest nie tak. Albo może czegoś nie rozumiem.
Go to the top of the page
+Quote Post
Nookie
post 26.08.2004, 20:03:07
Post #15





Grupa: Zarejestrowani
Postów: 56
Pomógł: 0
Dołączył: 15.09.2003

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


Poza tym metoda veriticala ma jeszcze jedna wade.. trudno jest porcjowac wynik tak zeby wyswietlalo sie po powiedzmy 50 wierszy na stronie...


dzieki za podpowiedzi..
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: 24.06.2025 - 20:29