Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Zaznaczanie z dwóch tabel
Forum PHP.pl > Forum > Przedszkole
maxis88
Chciałbym się zapytać, czy istnieje możliwość zaznaczenia konkretnych komórek z dwóch tabel jednak w taki sposób żeby to co znajdzie w pierwszej było od razu warunkiem zaznaczenia w drugiej ?
( wiem ze cos podobnego mozna zrobic poprzez UNION )

np:
'SELECT 'id','kategoria' FROM zakupy WHERE ... '
i teraz żeby w drugim SELECT warunkiem było "id" z pierwszego selecta...

oczywiście istnieje możliwość rozłączenia tego na dwa osobne pytania ale po co sobie zaśmiecać kod ... dlatego pytam...
nospor
nie rozumiem pytania.
  1. SELECT * FROM tabela1,tabela2 WHERE tabela1.id=tabela2.id

?
maxis88
Cytat(nospor @ 23.04.2010, 07:36:04 ) *
nie rozumiem pytania.
  1. SELECT * FROM tabela1,tabela2 WHERE tabela1.id=tabela2.id

?



Sprawa wygląda tak, że mam dwie tabele: jedna zawiera listę "zakupów" klienta a druga zawiera produkty...
w tabeli zakupów jest okrojona ilość informacji dlatego zawiera swego rodzaju wskaźnik do tabeli z produktami i z niej pobiera potrzebne dane...

dlatego potrzebuje z tabeli "zakupy" pobrać ów wskaźnik ( ew dwa ) który jest "id" w tabeli produktów i z nich pobrać wszystkie informacje
nospor
no to dobrze ci napisalem zapytanie smile.gif

mozna tez je zamienic na LEFT JOIN
  1. SELECT * FROM zakupy
  2. LEFT JOIN produkty ON zakupy.idproduktu=produkty.id
maxis88
Cytat(nospor @ 23.04.2010, 07:57:36 ) *
no to dobrze ci napisalem zapytanie smile.gif

mozna tez je zamienic na LEFT JOIN
  1. SELECT * FROM zakupy
  2. LEFT JOIN produkty ON zakupy.idproduktu=produkty.id



wykombinowałem takie coś:
  1. $zaznacz=mysql_query("SELECT towar,kategoria,ilosc FROM zakupy WHERE klient='$nick' AND status='Koszyk' LEFT JOIN zakupy.kategoria ON zakupy.towar=zakupy.kategoria.id");


czy to teraz mi zaznaczy wszystko z drugiej tabeli gdzie jej id=kategorii pierwszej tabeli i "ilość" z pierwszej ? ;P

sry ale nigdy się tym nie bawiłem wcześniej i nie wiem na jakiej zasadzie to działa ;P
nospor
jesli chcesz pobrac konkretne pola z roznych tabel, to musisz w SELECT powiedziec ktore pole z ktorej tabeli:
select tabela1.pole1, tabela1.pole2, tabela2.polejakiesinne.....
maxis88
Cytat(nospor @ 23.04.2010, 08:16:10 ) *
jesli chcesz pobrac konkretne pola z roznych tabel, to musisz w SELECT powiedziec ktore pole z ktorej tabeli:
select tabela1.pole1, tabela1.pole2, tabela2.polejakiesinne.....


mogłbyś zmodyfikować mój kod tak żeby było dobrze ?;/ wiem że marudzę ale coś sobie z tym nie radzę jeszcze...
-nazwa drugiej tabeli to prawdopodobnie ( jeśli dobrze zrozumiałem ) zakupy.kategoria
-a ID drugiej tabeli które chcę CAŁE wyciągnąć to zakupy.kategoria.id (?)
- do tego z pierwszej tabeli chcę jeszcze wyświetlić "ilosc"

podsumowując:
cala druga tabela + ilość z pierwszej

będę bardzo wdzięczny
nospor
Cytat
cala druga tabela + ilość z pierwszej
przeciez to są podstawy. zapoznaj sie z podstawami mysql...
Druga tabela to nie zakupy.kategoria.... to jest pole kategoria z tabeli zakupy
zapoznaj sie tez ze skladnia mysql bo takie byki robisz ze sie w glowie nie miesci. to nic ze sie nie znasz - od tego masz manuala by doczytac jaka jest skladnia

  1. $zaznacz=mysql_query("SELECT produkty.*, zakupy.ilosc FROM zakupy LEFT JOIN produkty ON zakupy.towar=produkty.id WHERE klient='$nick' AND status='Koszyk' ");

przyjalem ze twoja druga tabela to PRODUKTY. Jesli to KATEGORIA to zmień na KATEGORIA a nie zadne ZAKUPY.KATEGORIA.
maxis88
Cytat
Druga tabela to nie zakupy.kategoria.... to jest pole kategoria z tabeli zakupy


no właśnie, że zakupy.kategoria ( czyli jak mówisz pole kategoria w zakupy) to nazwa mojej tabeli ( kategorii produktów ) zawierającej produkt ktorego szukam...

ogólnie ma to strukturę:

Kategoria1
--produkt1
--produkt2
--...
Kategoria2
--produkt1
--produkt2
--....
Zakupy
--zakup1 [ zawiera pole "kategoria" i "towar" gdzie -towar- to id w -kategoria- oraz -ilosc-]
--zakup2 ['id', 'towar=id produkt1', 'kategoria= nazwa tabeli w ktorej ma szukac', 'kupujacy']
nospor
Cytat
no właśnie, że zakupy.kategoria ( czyli jak mówisz pole kategoria w zakupy) to nazwa mojej tabeli ( kategorii produktów ) zawierającej produkt ktorego szukam...
nie kumam.... masz tabele, ktora sie nazywa "zakupy.kategoria" ? Dokladnie tak sie nazywa?

Podaj strukture swojej bazy, z dokladną nazwą tabel i pol.
maxis88
  1. $zakupy="id MEDIUMINT(255) NOT NULL AUTO_INCREMENT,";
  2. $zakupy.="towar TEXT NOT NULL,"; // zawiera id w kategorii (tabeli )
  3. $zakupy.="kategoria TEXT NOT NULL,"; // zawiera nazwę kategorii ( tabeli )
  4. $zakupy.="klient TEXT NOT NULL,";
  5. $zakupy.="ilosc TEXT NOT NULL,"; // zakupiona ilosc
  6. $zakupy.="info TEXT NOT NULL,";
  7. $zakupy.="zakup TEXT NOT NULL,";
  8. $zakupy.="status TEXT NOT NULL,";
  9. $zakupy.="PRIMARY KEY(id)";
  10.  
  11.  


budowa kazdej kategorii
  1. $item="id MEDIUMINT(255) NOT NULL AUTO_INCREMENT,";
  2. $item.="nazwa TEXT NOT NULL,";
  3. $item.="ilosc INT(20) NOT NULL,"; //ilosc na stanie
  4. $item.="cena VARCHAR(30) NOT NULL,";
  5. $item.="opis TEXT NOT NULL,";
  6. $item.="przesylka TEXT NOT NULL,";
  7. $item.="zdjecie TEXT NOT NULL,";
  8. $item.="miniaturka TEXT NOT NULL,";
  9. $item.="kategoria TEXT NOT NULL,";
  10. $item.="PRIMARY KEY (id)";
nospor
wybacz, ale nic mi nie mowi przedstawiony przez Ciebie zapis.

ps: analizujac wszystko co tu napisales przyszla mi do głowy nieprawdopodobna myśl:
czy u ciebie w bazie, kazda kategoria to odzielna tabela? I tabela ma taką nazwą jak nazywa się kategoria?
maxis88
wersja "obrazkowa" haha.gif
Struktura i przykład
Zakupy [id | towar | kategoria | klient | ilosc | info | zakup | status]
[1 | 1 | Piłki | maxis| 3 | 0 | 0 | Koszyk]

Piłki [id | nazwa | ilosc | cena | opis | przesylka | zdjecie | miniaturka | kategoria]
[1 | nike | 99 | 2.30 | OPIS| 0 | adres | adres | Pilki ]



PS
było mi tak wygodniej żeby każda tabela to oddzielna kategoria ... poza tym chyba szybciej mi znajdzie element jak przeszuka jedną mniejszą tabelę niż taka która ma wszystkie elementy
nospor
Cytat
było mi tak wygodniej żeby każda tabela to oddzielna kategoria ...
No nic dziwnego ze sie nie rozumielismy... ja mialem przed oczami normalną strukturę bazy danych a ty w rzeczywistosci masz jakąś sieczkę...

Tak się nie robi. To jest totalnie źle zrobione. Na takiej strukturze nie da sie normalnie funkcjonowac.

To sie robi tak:
jedna tabela na towar
jedna tabela na kategorię.
Jesli towar moze nalezec do kilku kategorii to tworzy się dodatkową jedną tabele łączącą towar z kategorią
maxis88
Niezbyt rozumiem sens tworzenia oddzielnych tabel dla każdej pojedynczej kategorii skoro tworzymy też dla każdego produktu oddzielną tabele ...
Dla mnie będzie to jeszcze większy śmietnik niż jest teraz, jak nasiekam 10 000 tabel. Tak przynajmniej mam "schowany" każdy towar do kategorii i kiedy chcę dostać się do konkretnej grupy produktów to jedynie otwieram konkretną tabelę i wyświetlam jej zawartość...

No ale to już nie ma co dyskutować... rozumiem, że nie da się tego zrobić ? Czy da się, ale lepiej pozostać przy tym co mam i tego nie ruszać skoro działa ;P ( mam dwa oddzielne SELECT'y )
nospor
Cytat
Niezbyt rozumiem sens tworzenia oddzielnych tabel dla każdej pojedynczej kategorii skoro tworzymy też dla każdego produktu oddzielną tabele ...
Dla mnie będzie to jeszcze większy śmietnik niż jest teraz, jak nasiekam 10 000 tabel
smile.gif
W moim rozwiązaniu masz 3 tabele a nie 10tys......

Jedna tabela na towar oznacza jedną tabelę a w niej wszystkie towary jako rekordy
Jedna tabela na kategorie oznacza ze masz jedną tabele o nazwie KATEGORIA i wniej są zapisane wszystkie kategorie jako rekordy
smile.gif

Cytat
Czy da się, ale lepiej pozostać przy tym co mam i tego nie ruszać skoro działa
Nie. To trzeba przepisac tak jak ci zaproponowalem
maxis88
no to się nie zrozumieliśmy ;P a z tym 10 tys to był przykład jak widać trochę nietrafiony ;P

OK to zostane przy tym co mam bo za dużo czasu by mnie kosztowało przerabianie teraz całego mechanizmu haha.gif
nospor
Cytat
OK to zostane przy tym co mam bo za dużo czasu by mnie kosztowało przerabianie teraz całego mechanizmu
Oj... uwierz mi na slowo ze bys na tym zdecydowanie lepiej wyszedl jakbys jednak przerobil. No ale Twoj wybor - zyj w blogiej nieswiadomosci. zebys sie tylko kiedys nie zdziwil smile.gif
Wykrywacz
On chyba niema świadomości na co się porywa.

Zróbmy to obrazkowo, zamówiłem sobie dekorolkę, gazówkę pod namiot, namiot, piłkę do kosza i rower.
Pokaż mi jak byś zrobił selecta aby wyświetlić to wszystko w formularzu zamówienia.

Celowo cię o to proszę aby pokazać ci zupełny brak optymalności twojego pomysłu.
nospor
Cytat
Pokaż mi jak byś zrobił selecta aby wyświetlić to wszystko w formularzu zamówienia.
No wlasnie o to zapytal w tym temacie - po to go zalozyl by uzyskac odpowiedź

A na chwilę obecną robi to ponoc tak:
Cytat
Czy da się, ale lepiej pozostać przy tym co mam i tego nie ruszać skoro działa ;P ( mam dwa oddzielne SELECT'y )

Nie za bardzo to widze jak to zrobil, no ale widac jakos zrobil. jesli mu z tym dobrze to jego wybor smile.gif
maxis88
oj już już haha.gif poprawiłem ;P
a ak to wyglądało ? mniej wiecej tak:


  1.  
  2. db_connect();
  3. $nick=$_COOKIE['nick'];
  4.  
  5.  
  6. $zaznacz=mysql_query("SELECT * FROM zakupy WHERE klient='$nick' AND status='Koszyk'");
  7. $koszt=0;
  8.  
  9. while($pokaz=mysql_fetch_row($zaznacz)){
  10.  
  11. $zaznacz2=mysql_query("SELECT * FROM $pokaz[2] WHERE id='$pokaz[1]'");
  12. $pokaz2=mysql_fetch_row($zaznacz2);
  13. echo" -$pokaz[4] szt. $pokaz2[1]<br />";
  14. $zamien=str_replace(",", ".", $pokaz2[3]);
  15. $koszt+=$pokaz[4]*$zamien;
  16.  
  17. }
  18. echo"Razem: $koszt zł + koszty przesyłki";
  19.  
  20.  
  21.  


jak widać da sie haha.gif
nospor
Cytat
jak widać da sie
tja... tylko ty napisales ze wykonales to za pomocą dwoch zapytan a tu niestety panie kolego nic bardziej mylnego
Owszem, w kodzie masz dwa zapytania, ale zauwaz ze jedno z nich wykonywane jest w petli, czyli wykona się tyle razy, ile jest towarów w zakupach. Bardzo "optymalne" tongue.gif
Wykrywacz
Zamiast odpalić silnik, można zaprzęgnąć osła i auto też będzie jechało.
maxis88
no ale w tym przypadku to jest koszyk jednego użytkownika więc nie będzie więcej elementów niż on sam zamówił ...smile.gif
robiąc jednym SELECT'EM tak jak mówicie miałbym może z 2 linijki kodu mniej ... więc dlaczego niby nie jest to optymalne ?

Cytat(Wykrywacz @ 23.04.2010, 12:25:15 ) *
Zamiast odpalić silnik, można zaprzęgnąć osła i auto też będzie jechało.


każdy sobie radzi jak potrafi ;P
nospor
Cytat
to jest koszyk jednego użytkownika więc nie będzie więcej elementów niż on sam zamówił ..
i co z tego? zamowil 10 towarow to wykonasz 10 zapytan zamiast jednego. Przy duzym ruchu na stronie zajedziesz baze. A przeciez twoja struktura odbija sie na wszystkim a nie tylko na tej jednej akcji.
Poza tym ucz sie pisac optymalnie. Jak sie przyzwyczaisz do takich zlych rozwiązan to nic z ciebie nie bedzie (nie chce cie obrazic, stwierdzam jedynie fakt)


Cytat
robiąc jednym SELECT'EM tak jak mówicie miałbym może z 2 linijki kodu mniej ... więc dlaczego niby nie jest to optymalne ?
Ale tu nie chodzi o liczbe linijek w kodzie. Nawet jakby sie okazalo ze bedzie o 20 linijke w kodzie php wiecej to tez bedzie dobrze. Tu chodzi o baze. Wykonanie 10 zapytan takich jak twoje jest wolniejsze od jednego naszego - tu wlasnie lezy pies pogrzebany.
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.