Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dane Z 2 Tabel Naraz
Forum PHP.pl > Forum > Bazy danych > MySQL
Nookie
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
Parti
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)
Nookie
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
Parti
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
cim
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'
Parti
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.
Nookie
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

}
Vertical
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
Nookie
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
Parti
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.
ActivePlayer
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.
Vertical
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
Nookie
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!
Parti
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.
Nookie
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..
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.