Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [sql] pomoc w zawilym zapytaniu
Forum PHP.pl > Forum > Przedszkole
gojira
Witam
mam o to taki problem...
mam dwie tabele, jedna gdzie mam numer katalogowy (Id) i id produktu (Id_prod) w drugiej zas mam Id_prod i nazwe. tabele(mam nadzieje ze udalo mi sie) sa polaczone relacyjnie. chce jednak teraz sformulowac zapytanie, gdzie majac numer katalogowy z jednej tabeli, moc wybrac z drugiej odpowiadajaca mu nazwe:
Tabela1:
Id: Id_prod:
1 1
2 1
3 3
Tabela2:
Id_prod: nazwa:
1 kuchnia
2 pokoj
3 lazienka

mam Id=1 gdzie Id_prod=1
chce aby wyswietlilo mi przy Id Kuchnia

jak zrobic takie zapytanie questionmark.gif
PiXel2.0
To niezwykle prosta konstrukcja:

  1. SELECT nazwa FROM tabela_1, tablea_2 WHERE tabela_1.id_prod = tabela_2.id_prod AND id = X

X = nr katalogowy.

Pamietaj o podaniu nazw tabel i polaczeniu tych nazw kropka z nazwami kolumn (kluczy) ktore maja taka sama nazwe.
gojira
zapytanie dziala, dzieki:)
ale chyba moj blad logiczny, bo to okazuje sie chyba niepomocne do tego coc chce zrobic;/ (ale nauczylem sie nowej rzeczy biggrin.gif)

tak czy inaczej. sytuacja z tabelami ma sie jak pisalem wczesniej. problem w tym, ze cche aby w liscie pojawily sie wszystkie nazwy przy czym, chce aby jako pojawiajaca sie na wejsciu, byla ta przypisana do danego Id (numeru katalogowego)
tylko wlasnie niebardzo wiem jak to zrobic, kombinuje i kombinuje... jak mialem ze nazwa ustawiona na przypisanej do Id, to reszta pozycji tez sie zwala tak samo, jak juz mam wybor pozycji, to na wstepie ustawia mi sie na pierwszej a nie na przypsianej do Id... troche to zagmatwane:P
PiXel2.0
Czyli chodzi o posortowanie rekordow questionmark.gif
Chodzi o to aby zestaw wynikow skladal sie z tylu rekordow ile jest kategorii w kazdym z rekordow ma sie znalezc nazwa kategorii przy czym na pierwszej pozycji w zestawie wynikow ma byc rekord o wskazanym ID a dalej w dowolnej kolejnosci questionmark.gif
Dobrze zrozumialem questionmark.gif
gojira
to ja moze pokaze, jako ze jest to nasze zadanie na zaliczenie (oczywiscie sami sie uczymy wszystkiego bo nie laska wytlumaczyc nam paru zagadnien sleep.gif)
u mojego kolegi wyglada to tak... http://info.wsisiz.edu.pl/~tataryno/admin/lista.php?sort=1 nacisnij edytuj i zobaczysz o co mi chodzi... trafiles z tym ze wyswietlac maja sie nazwy a jako ta wyswietlana na wstepie ma byc przypisana do ID... przy czym jak mowilem mam dwie tablice (nie wiem jak ma kolega, zreszta nie sluzy mi kode (skompiradlo) a takze napewno mam inaczej, jako ze kazdy sobie...;/)
pokazuje jak jest u niego, poniewasz jestesmy zobligowani do robienia tego samego na swoj sposob...
PiXel2.0
Jak klikam "edytuj" to widze, ze wartosci z pol danego rekordu zostaly podstawione pod pola textowe.
Do tego wystarczy pobrac tylko jeden rekord wiec nie bardzo rozumiem... :/
gojira
ogolnie to nie mam z tym problemu, problem mam dopiero z ta rabana lista... glownie to wlasnie o liste mi chodzi (wybacz ze niejasno mowilem, ale siedze nad tym od 8 rano ;/)
tak czy inaczej nie ma problemu tak dlugo jak pobieram dane z tablicy T1, gdzie mam wszystko. problem jest z kategoriami o ktorych jak powiedzialem. dane ktore pobieram z T1 mam tylko id_prod a nie ma nazw, i te nazwy chcialbym aby bylo pobrane z drugiej Tabeli... i tu problem wszystko mi sie wyswietla, ale nie wiem jak ustawic, tak jak u niego, ze jak nacisnales edytuj, to w kategorii pojawila CI sie zmiejsca kategoria danego produktu, przy czym z tej samej lisy mozesz wybrac inne... pzrewertowalem siec i cos z selected jest... ale nadal nie mam zielonego pojecia jak zrobic to u mnie. (lista jest generowana dynamicznie)
PiXel2.0
No wiec do tego co chcesz uzyskac relacja sie nie nadaje (szedles w zlym kierunku).

Musisz uzyc dwoch zapytan:
Jednego aby pobrac jeden wiersz z danymi ktorymi wypelnisz pola tekstowe (i uzyskasz tez ID kategorii do jakiej nalezy dany produkt).
A drugiego zeby pobrac wszystkie kategorie wraz z ich ID.

Pozniej robisz tak:

  1. <?php
  2. echo '<select name="zmienna">';
  3. while($kategoria = mysql_fetch_array($wynik_kategorie)){
  4. $select = $kategoria['id_kategorii'] == $dane_produktu['id_kategorii'] ? ' selected' : '';
  5. echo "<option value=\"{$kategoria['id_kategorii']}\"{$select}>{$kategoria['nazwa_kategorii']}</option>":
  6. }
  7. echo '</select>';
  8. ?>
gojira
czyli to pierwsze tak ma wygladac ?
  1. <?php
  2. $query = "SELECT * FROM `produkty` WHERE `Id`='$id'";
  3. $result = mysql_query ("$query") or die ("Zapytanie zakończone niepowodzeniem");
  4. $val = mysql_fetch_row($result);
  5. ?>


a drugie to zapytanie do drugiej tabeli?? dobrze rozumiem ?
  1. <?php
  2. $query1 = "SELECT * FROM `rodzaje`";
  3. $result1 = mysql_query ("$query1") or die ("Zapytanie zakończone niepowodzeniem");
  4. while ($val1 = mysql_fetch_array($result1)){
  5. ?>
Prym
hmm tak sobie czytam i szczerze mowiąc może nie do końca łąpie co chcez zrobić ale może tak:

Kod
SELECT * FROM tabela_1 as t1 LEFT JOIN tablea_2 as t2 ON t1.id_prod = t2.id_prod OR t1.id_prod<>t2.id_prod WHERE id = X


dzięki takiej konstrukcji w 1 zapytaniu otrzymujesz nazwe z t1 oraz cala liste kategori z t2 . proponuje potestowac w phpmyadminie to zobaczysz jakie masz wyniki z takiej formy zapytania
PiXel2.0
Mniej wiecej tylko w mysql_query() daj sama zmienna $query bez cudzyslowa winksmiley.jpg

Jesli w pobranym wierszu z danymi produktu masz ID kategorii to wystarczy wypelnic pola danymi a w menu rozwijanym wyswietlic wszystkie wiersze jakie beda w wyniku kategorii i dodac selected tam gdzie ID z wyniku produktu jest takie same jak ID kategorii w danej literacji petli jaka przedstawilem wczesniej.

Prym,
LEFT JOIN daje sie wtedy kiedy chcemy uzyskac wszystkie wiersze pierwszej tabeli nawet kiedy warunek relacji nie jest spelniony a to jest tutaj potrzebne jak piate kolo u wozu tongue.gif
gojira
dzieki Prym, poprobuje, zawsze sie czegos nowego naucze winksmiley.jpg

Pixel, mam tylko pytanie, co to jest $dane_produktu questionmark.gif co wg Ciebie ma tu byc ^^ bo tego jednego nie rozgryzlem, to ma byc val1 (jak dalem na moim przykladzie)questionmark.gif
PiXel2.0
$dane_produktu to tablica asocjacyjna z wynikiem tego jednego wiersza gdzie sa wszystkie informacje o produkcie z ID jego kategorii wlacznie.
Prym
smile.gif PiXel2.0 , czemu wszystkie wiersze? przeciez jak dasz po where warunek id=x to masz wyswietlony jedynie 1 wiersz z tabeli 1 (wszystko co po where odnosi sie do tabeli 1 a co po ON do tabeli 2) i wszystkie wiersze z tabeli 2 - tyle ze wiersz 1 tabeli jest powtórzony przez wszystkie wiersze 2 tabeli - miło ładnie i przejrzyscie

no ale oczywiscie mozna to zalatwiac kilkoma zapytaniami zwlaszcza jak to administracyjny panel wiec i wielu wejsc nei ma naraz

smile.gif
gojira
no to dobrze pomyslalem, dziala... tyle ze tongue.gif cos chyba musialem spaprac... tak to u mnie wyglada: http://info.wsisiz.edu.pl/~makowsm0/admin/...page=&sort=
pojawila sie druga lista oO nie wiem teraz skad haha.gif

kod do pierwszego zapytania i wypelnienei pol textowych:
  1. <?php
  2. $query = "SELECT * FROM `produkty` WHERE `Id`='$id'";
  3. $result = mysql_query ($query) or die ("Zapytanie zakończone niepowodzeniem");
  4.  
  5. $val = mysql_fetch_row($result);
  6. $id=$val["0"];
  7. $nazwa1=$val["1"];
  8. $producent1=$val["2"];
  9. $ilosc=$val["3"];
  10. $cena=$val["4"];
  11. $nazwarodz=$val["5"];
  12. $idrodz=$val["6"];
  13. $rok=$val["7"];
  14. $opis=$val["8"];
  15. ?>

i kod do drugiej czesci z lista:
  1. <?php
  2. $query1 = "SELECT * FROM `rodzaje`";
  3. $result1 = mysql_query ($query1) or die ("Zapytanie zakończone niepowodzeniem");
  4.  
  5. echo '<select name="zmienna">';
  6. while($val1 = mysql_fetch_array($result1)){
  7. $select = $val1['Id_rodz'] == $val['6'] ? ' selected' : '';
  8. echo "<option value=\"{$val1['Id_rodz']}\"{$select}>{$val1['Nazwa_rodz']}</option>";
  9. }
  10. echo '</select>';
  11. ?>

nie wiem gdzie tu sie zalegla druga lista;/
ale dziala juz to selected biggrin.gif
PiXel2.0
Prym,

Chodzi o to, ze LEFT JOIN stosuje sie tylko gdy nie ma pewnosci czy do wierszy z pierwszej tabeli beda spelniajace warunek wiersze z drugiej tabeli co bez LEFT JOIN skutkowaloby brakiem wierszy pierwszej tabeli w wyniku.
Czyli wtedy gdy mamy relacje 1:N gdzie N moze byc zerem (brak wierszy) a wiersze pierwszej tabeli sa potrzebne w wyniku.

A to zapytanie ktore podales wczesniej jest bez sensu bo to samo mozna uzyskac poprzez takie:
  1. SELECT * FROM tabela_1, tablea_2 WHERE id = X
gojira
dobra ten ostatni post jest niewazny tongue.gif znalazlem blad, za duzo w okol mnie sie dzieje... troche roztrzepany dzis...

jesli powiedzielibyscie mi ostatnia rzecz, bylbym wdzieczny...,bo to bedzie znaczylo niemal koneic (bo usun i dodaj podobnie sie robi)

chodzi mi o zapytanie sql w przypadku edycji... $result = mysql_query("UPDATE `produkty` SET autor='$autor', itd WHERE `id`=''$id") bo raczej id nie bede zmienial, ale teraz moje pytanie... jak podstawic to zapytanie pod przycisk, aby zaskoczylo??
Prym
wsumie racja tylko inaczej wyglada odpowiedz przy left join smile.gif przyjemniej wydobywa sie takie dane. oki nie bylo tematu smile.gif
PiXel2.0
I znowu musze Cie ciagnac za jezyk aby sie dowiedziec co masz na mysli piszac:
"jak podstawic to zapytanie pod przycisk, aby zaskoczylo??" dry.gif

1. ustalasz nazwy zmiennych do pol textowych oraz zmienna z ID tak aby byly wyslane do superglobalnej $_POST po zatwierdzeniu.
2 (opcjonalnie). filtrujesz dane z $_POST funkcja mysql_escape_string() lub mysql_real_escape_string().
3. robisz zapytanie:
  1. UPDATE produkty SET parametr1 = '$parametr1', parametr2 = '$parametr2' WHERE id = $id


Prym,

Pomysl z jednym zapytaniem i takim wynikiem jest ciekawy, ale to raczej nie jest zalecane bo pozniej trudno sie zorientowac do czego to wlasciwie bylo i po co akurat tak... winksmiley.jpg

Poza tym po pobraniu wiersza do wypelnienia pol textowych trzeba by cofnac wskaznik przy uzyciu mysql_data_seek() zeby kategorie pobieraly sie od poczatku winksmiley.jpg
gojira
jak mowilem troche rozstrzepany dzis... w dodatku musze isc na miasto zalatwiac w NIEDZIELE wazne sprawy ;( porazka... wroce i znow do php siadam...

chodzi mi o to, ze przy nacisnieciu przycisku, zmiany zostana zapisane do bazy danych... czyli podpiac jakos to zapytanie aby przy nacisnieciu przycisku, to zapytanie zostalo wyslane i zrealizowane

nie mniej dziekuje za wasz wklad smile.gif wkoncu ma to rece i nogi, choc jeszcze troche roboty przy tym jest;/
PiXel2.0
W pliku z formularzem zrob podstawowy warunek z uzyciem isset() ktory sprawdzi czy $_POST zawiera elementy z kluczami o nazwach zmiennych jakie napisales w folmularzu i jesli nie to ma sie wyswietlic formularz a jesli wszystkie sa to znaczy, ze dane zostaly wyslane i wtedy podstawiasz elementy $_POST pod zapytanie UPDATE i na koncu mozesz uzyc naglowka:
header('Location: index.php');
aby przekierowal klienta do indexu i jednoczesnie wyczyscil dane wyslane metoda POST smile.gif

P.S.:
Moze mi ktos pomoze w moim problemie questionmark.gif tongue.gif
http://forum.php.pl/SQL__Jak_sprawdzic_kto...rd__t80260.html
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.