[ corelko @ 26.09.2011. 13:31 ] @
Pozdrav svima. Izmodelovao sam bazu za neku kao prodavnicu racunara. Dosta mi je pomogao Bogdan sa foruma i radili smo u tom smeru da postujemo normalizaciju. Problem je sledeci. Imam 3 tabele: kategorija, proizvod i kategorija_proizvod.

U kategorija imam nesto ovako:
Code:

idKat   nazivKat
1        Procesor
2        RAM
3        HDD
4        Monitor
5        Napajanje


U proizvodi ovo:
Code:

idProiz  nazivProiz                    
1          Intel core 2 duo              
2          Intel Celeron 2,6GHz       
3          Intel Pentium 4               
4          Kingston 2GB                  
5          Kingston 1GB                  
6          Monitor Samsung          


A u kategorija_proizvod spoljne kljuceve iz kategorija i proizvod:
Code:

idKat    IdProiz
1         1
1         2
1         3
2         4
2         5
4         6


E sad ja trebam da korisniku aplikacije treba da omogucim da on izabere neku konfikuraciju za svoj racunar. Video sam da se to skoro svugde radi sa onim select listama i kako iz ove 3 tabele doci do proizvoda iz odredjene kategorije. Da bude jasnije evo sta bih zelio:

Code:

<label>Procesor:</label> <select name="procesor">
                                  <option value="">Ovde lista svih procesora</option>
                                  </select>   

<label>RAM memorije:</label> <select name="ram">
                                         <option value="">Ovde lista svih RAM memorija</option>
                                         </select>   

<label>Monitori:</label> <select name="monitori">
                                         <option value="">Ovde lista svih monitora</option>
                                         </select>   

i tako dalje. 


Znam da bi ovde trebalo koristiti i JOIN radi spajanja vise tabela ali ovo meni deluje mnogo komplikovano jer ucim. Recimo da imam 2 tabele kategorija i proizvodi i u proizvodima spoljni kljuc iz kategorije ja bih se snasao nekako al u ovom primeru nema sanse. Ako bi neko hteo da pomogne bio bih mu zahvalan. Takodje sam prilozio model baze da bude jasnije
[ stex @ 26.09.2011. 14:20 ] @
Za recimo procesore:
SELECT b.idProiz, b.nazivProiz FROM kategorija_proizvodi AS a LEFT JOIN proizvodi AS b ON a.idProiz=b.idProiz WHERE a.idKat = 1

Ovo sam napamet napisao.

A sto u tabeli prozivodi nisi stavio polje idKat? Nisi morao posebnu tabelu, osim ako jedan proizvod ne ide u vise kategorija.
[ corelko @ 26.09.2011. 14:29 ] @
Pa eto moze se desiti da proizvod moze pripadati u vise kategorija zato je tebala jos jedna tabela i tako kazu strucnjaci. Ja sam i krenuo tim putem sa 2 tabele gde u proizvodima imam id_kategorije i to je to ali su me upozorili da se tako ne radi. U ovom tvom slucaju cini mi se da bi ovu kategoriju zakovao u kod i kad se pojavi nova mora rucno da se dodaje svaki put. Nisam siguran ali nesto mi se cini. Valjda ce se javiti neko ko vlada ovime da pomogne. Hvala ti u svakom slucaju
[ vatri @ 26.09.2011. 14:51 ] @
Nadam se da je ovo odg. na tvoje pitanje:

Code:


select proizvod.naziv FROM proizvod

JOIN kategorija ON
      kategorija.idKat = '1' # umjesto 1 stavi $id_kat 

JOIN kategorija_proizvod ON
      kategorija_proizvod.idKat = kategorija.idKat 
      AND kategorija_proizvod.idProiz = proizvod.idProiz;



Predlazem ti da naucis JOIN , trebace ti cesto, a nije toliko tesko nauciti.
[ stex @ 26.09.2011. 15:25 ] @
Ja sam mislio da ti je JOIN problem i da znas sta ces dalje. Pa samo taj sql sto sam ti napisao stavis u petlju. Recimo:

$kat = mysql_query("SELECT * FROM kategorija");
while($row = mysql_fetch_assoc($kat)){
$q = mysql_query("SELECT b.idProiz, b.nazivProiz FROM kategorija_proizvodi AS a LEFT JOIN proizvodi AS b ON a.idProiz=b.idProiz WHERE a.idKat =". $row["idkat"]);
while($pro = mysql_fetch_assoc($q)){
//ovde generises select, samo pazi koje ce ti biti ime selecta

}
}

[ corelko @ 26.09.2011. 15:30 ] @
Shvatam ja JOIN donekle. Recimo ovako, ovde si zatrazio sve proizvode iz tabele proizvodi pa si upitu pridruzio jos i tabelu sa kategorijama i rekao da ti trebaju proizvodi iz one kategorije gde je idKat=1 a to su procesori a da bi upit znao koji su to proizvodi morao si da pridruzis i tabelu kategorija_proizovd i rekao da su to svi oni proizvodi ciji ciji kljucevi iz tabele kategorija_proizvod odgovaraju onim kljucevima iz kategorije i proizvoda. Cemu onda ovo:
Code:
JOIN kategorija ON kategorija.idKat = '1' # umjesto 1 stavi $id_kat 


kada si rekao da su to oni proizvodi koji odgovaraju ovome:
Code:
 kategorija_proizvod.idKat = kategorija.idKat 


ili je u tome sustina sto on ne zna sta znaci kategorija.idKat sto mu ne pridruzis tabelu prethodno.

Imam jos jedno pitanje ako stavim da mi je idKat=1 onda bi to samo vazilo za procesore. Mene najvise zbunjuje to sto treba da ovo uglavim u ovu moju select listu.
[ corelko @ 26.09.2011. 15:34 ] @
@stex
Ovo mi se cini kao da sam blizu resenja. Jos jedno pitanje: Da li umesto ovog a i b moram da stavim imena tabela?
[ stex @ 26.09.2011. 15:49 ] @
Umesto a i b mozes da stavi sta god hoces. A mozes i bez toga ali onda bi morao da kucas pored svakog polja i naziv tabele. Recimo SELECT proizvodi.idProiz, proizvodi.nazivProzivoda FROM prozivodi LEFT JOIN...itd , a ovako ti je krace. To je samo kad imas vise tabela u selektu.
[ corelko @ 26.09.2011. 17:10 ] @
Pokusacu vec nesto sa ovim da odradim pa se javljam sta sam uradio. Hvala puno
[ corelko @ 26.09.2011. 21:33 ] @

Code:
SELECT b.idProizvod, b.naziv_proizvoda FROM kategorija_proizvod AS a LEFT JOIN proizvod AS b ON a.idProizvod=b.idProizvod WHERE a.idKategorija = 1


Ovaj upit ne moze da se izvrsi. Poruka o gresci:

Code:
#1054 - Unknown column 'a.idKategorija' in 'where clause'


Ja sam samo prepravio nazive kljuceva jer se tako zovu u bazi, a vide se i iz modela.
[ corelko @ 26.09.2011. 22:38 ] @
Code:

select proizvod.naziv_proizvoda FROM proizvod

JOIN kategorija ON
      kategorija.idKategorija = 1

JOIN kategorija_proizvod ON
      kategorija_proizvod.Kategorija_idKategorija = kategorija.idKategorija 
      AND kategorija_proizvod.Proizvod_idProizvod = proizvod.idProizvod


Ovaj upit je dobar i zaista vrati sve proizvode koji pripadaju kategoriji ciji je idKategorija = 1 . E sad treba nekako da ovo organuizujem u moju listu. Moja neka ideja je kada izlistam sve kategorije pohvatam i njihove id-ove kao sto je neko gore predlozio i onda sa switch-case lagano. Hvala na ovom upitu vatri





[Ovu poruku je menjao corelko dana 26.09.2011. u 23:56 GMT+1]
[ vatri @ 26.09.2011. 23:57 ] @
Evo tek sad sam procitao sta ti u stvari trebas. Evo kod koji ce ti ispisati selekte koje ti zelis.
Naravno malo popravi kod ako budes "kacio" na produkciju: dodaj koji if za provjeru i tako te fore...


Code (php):

/**
*  Uzimamo podatke iz baze:
**/

$q = "select distinct
         k.naziv as kategorija, k.idKat,
         p.naziv as proizvod, p.idProiz
      FROM proizvod p
          JOIN kategorija_proizvod kp ON    kp.idProizv = p.idProiz
          JOIN kategorija k ON k.idKat = kp.idKat AND kp.idProizv = p.idProiz; "
;

$res = mysql_query($q) or die('error #1');

$arrKat = array();

if( mysql_num_rows($res))
{
   while($row = mysql_fetch_array($res))
   {
     // sacuvamo podatke u varijable
     $naziv_kategorija = $row['kategorija'];
     $idKat = $row['idKat'];
     $naziv_proizvoda = $row['proizvod'];
     $idPro = $row['idProiz'];
     
     // napunimo niz (array)
     $arrKat[$idKat]['naziv'] = $naziv_kategorija;
     $arrKat[$idKat]['items'][$idPro] = $naziv_proizvoda;
   }
}

/**
* Ispisuujemo podatke po zelji:
**/


//DEBUG: ovo odkomentiraj da vidis kako izgleda $arrKat  !
//echo '<pre>';print_r($arrKat);echo '</pre>';

foreach($arrKat as $katid => $arrData)
{
     $naziv = $arrData['naziv'];
     $nazivHTML = strtolower( str_replace(' ', '_',$naziv));// pretvorimo u mala slova i zamjenimo SPACE sa _
     $arrProd =  $arrData['items'];
     
     echo "<label>$naziv</label>";
     echo "<select name='$nazivHTML'>";
     foreach($arrProd as $idPro => $proNaziv)
     {
          echo "<option value='$idPro'>$proNaziv</option>";
     }
     echo "</select>";
}
 




[Ovu poruku je menjao vatri dana 27.09.2011. u 01:09 GMT+1]
[ corelko @ 27.09.2011. 14:16 ] @
Vatri hvala ti puno. Svakako ce mi ovo koristiti. Evo kako sam ja uz pomoc drugara i onog tvog upita odradili posao sa funkcijom pa mozda nekom jos zatreba:


Code:

function lista($naziv) 
{
    $lista = "";
            $upit = 'SELECT proizvod.idProizvod, proizvod.naziv_proizvoda, kategorija.naziv_kategorije
                FROM proizvod
                JOIN kategorija ON kategorija.idKategorija = ( 
                SELECT kategorija.idKategorija
                FROM kategorija
                WHERE kategorija.naziv_kategorije =  "'.$naziv.'" ) 
                JOIN kategorija_proizvod ON kategorija_proizvod.Kategorija_idKategorija = kategorija.idKategorija
                AND kategorija_proizvod.Proizvod_idProizvod = proizvod.idProizvod';
    $s = mysql_query($upit) or die(mysql_error());
    $br_redovaUbazi = mysql_affected_rows();
        $i = 0;
    $lista = '<div class="form_row"><label class="contact"><strong>'.$naziv.'<strong>
</label><select name="'.$naziv.'"><option value="-1">Odaberite</option>';
    while ( $red = mysql_fetch_assoc($s) )
    { 
                                    
    $lista .= '<option value="'.$red['idProizvod'].'">'.$red['naziv_proizvoda'].'</option>';
    $i++;
    }
                                
    echo $lista .= '</select></div>'; 
}

echo lista("Procesor").' '.lista("Maticna ploca").' '.lista("Monitor").' 
'.lista("Hard disk").' '.lista("RAM").' '.lista("Graficka karta").' 
'.lista("Napajanje").' '.lista("Tastatura").' '.lista("Mis").' '.lista("Opticki uredjaj");
echo '</div><div class="form_row"><input type="submit" name="submit" value="Naruci konfiguraciju! ">
</div></form>';


Ovo radi fino a dobro je sto je funkcija jer cu morati da koristim ovaj kod na jos mesta. E sad se javlja drugi problem. Ako pogledate model videcete zavisnost narudzbe od korisnika dakle u tabelu narudzba smestim idNaruzbe i naziv_narudzbe. To je lako kad sabmitujem formu id je auto_increment a naziv mogu da stavim da je neki random,nebitno. Zbog osobine veze nastala je tabela korisnik_narudzba idKorisnik imam u sesiji a idNarudzba mogu da saznam funkcijom mysql_insert_id(); i to strpam u tabelu korisnik_narudzba. Problem mi je ova treca tabela narudzba_proizovd. idNaruzbe imam ali znam kako da sve selektovane proizvode tj njihove id-ove upisem u tabelu tj da bi se znalo koji sve proizvodi pripadaju jednoj od naruzbi. Da li da ih pokupim u neki niz i onda jedan po jedan smestam u tabelu ili kako?Hvala jos jednom na dosadasnjoj pomoci.