[ koya.90 @ 28.04.2013. 00:38 ] @
Pozdrav svima.
Molim za pomoć!
Radim "Studentski Servis", za školu na kojoj studiram a ujedno i sebi diplosmki rad...
Imam problem sa sql select-om.

Da bi vas upoznao sa mojim problemom, prvo pogledajte tabele putem linka: https://docs.google.com/file/d...ZpVTFLYVBpUlE/edit?usp=sharing
E sad, problem mi je u stranici za prijavu ispita.
Da bih prijava ispita radila pravilno mora se dobro organzovati upit.
Recimo mi prijavljujemo ispit, 2 smo godina i treba da polažemo ispite 3 semestra!
Znaci,mi moramo da iz spiska ispita za prijave ispita izbacimo ispite koji pripadaju 4,5,6,7 i 8 semestru (tj ono sto jos nismo imali predavano a imacemo),
moramo da izbacimo polozene ispite i moramo da izbacimo one za koje smo dobili zabranu polaganja.
Ali moramo da vodimo računa o tome da ispiti pripadaju našem smeru (recimo smeru informacionih tehnologija).
E sad,kad odbijamo polozeni predmet iz spiska prijave, taj predmet mora da se odnosi samo na naš tj. na naš broj indeksa koji je recimo 4-103/2010, a takodje i zabranu koja je izrečena samo za nas broj indeksa...

Nadam se da shvatate.

Pogled na kod:
Code:

$indeks = $red['indeks'];
$zadnji_overen_sem = $red['zadnji_overen_sem'];  //zadnji overen semestar 
$id_smera = $red['indeks'];  //broj 4 iz indeksa predstavlja smer: 4-103/2010
if(intval($id_smera[0]) < 5 AND intval($id_smera[0]) > 0 ) // Da li je smer u intervalu (0,5)
$id_smera[0];

$spisak = " SELECT * FROM spisak_ispita, predmet, predmet_po_smeru ,profesor
            WHERE spisak_ispita.sifra_predmeta = predmet.sifra_predmeta
            AND spisak_ispita.sifra_predmeta = predmet_po_smeru.sifra_predmeta
            AND predmet.sifra_predmeta = predmet_po_smeru.sifra_predmeta
            AND predmet_po_smeru.id_smera = '$id_smera'
            AND predmet_po_smeru.broj_semestra <= '$zadnji_overen_sem'
            AND spisak_ispita.id_prof = profesor.id
            AND spisak_ispita.id_ispit NOT IN (select id_prijave_ispita  from ocena) 
            AND spisak_ispita.id_ispit NOT IN (select id_ispit from prijava_ispita)
        ";  

$rezultat = mysql_query($spisak);
            while($red = mysql_fetch_array($rezultat)) 
                {
                $id_ispit = $red['id_ispit']; 
                $sifra_predmeta = $red['sifra_predmeta'];
                $ime_predmeta = $red['ime_predmeta'];
                .
                .
                .
                }



Ovaj sql select dobro radi,osim poslednja 2 reda:

Code:
AND spisak_ispita.id_ispit NOT IN (select id_prijave_ispita  from ocena) 
AND spisak_ispita.id_ispit NOT IN (select id_ispit from prijava_ispita)


Oni bi trebali da kazu da to vazi samo za nas indeks 4-103/2010 $indeks = $red['indeks']; ...

Ja ne znam kako da to dopisem u ovaj upit, ali razumem problem.

Nadam se da me razumete sta je problem odnosno da sam vam objasnio...

SQL kod tabela možete videti putem linka: https://docs.google.com/file/d...N5MlNfaHVuWnc/edit?usp=sharing

Hvala svima unapred koji mi daju sugestiju ili mi rese problem!
[ bogdan.kecman @ 28.04.2013. 16:09 ] @
pre bilo cega
Citat:
koya.90:
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


1. 2013. godina, MyISAM nije ACID, moze lako da se koruptira, nije scalable, nije .... nije za upotrebu. Ako taj sistem treba nesto stvarno da radi i ti podaci treba da budu koliko toliko vazni, moras da koristis InnoDB

2. latin1 ?!?!??! kako tu mislis da upises ime grada iz koga dolazis ?! [abac? Shabac? Sabac? u 2013. godini UTF8 je minimalno sto treba da podrzis!

3. referencijalni integritet? pricamo o relativno kompleksnom sistemu vrlo bitnom, ako ne tebi onda bar ostalim studentima, moras da imas referencijalni integritet na takvoj bazi

idemo malo dalje

Citat:
koya.90:
SELECT * FROM spisak_ispita, predmet, predmet_po_smeru ,profesor


da li si cuo za JOIN? procitaj: http://dev.mysql.com/doc/refman/5.6/en/join.html

explicitno koristenje join-a ti
- smanjuje mogucnost greske
- daje ti bolju sliku sta se tacno desava
- daje mogucnost optimizeru da bolje shvati upit
- daje tebi ideju kako bolje da napises upit (i zasto ti upit ne radi)


Citat:
koya.90:

Ovaj sql select dobro radi,osim poslednja 2 reda:

Code:
AND spisak_ispita.id_ispit NOT IN (select id_prijave_ispita  from ocena) 
AND spisak_ispita.id_ispit NOT IN (select id_ispit from prijava_ispita)


Oni bi trebali da kazu da to vazi samo za nas indeks 4-103/2010 $indeks = $red['indeks']; ...


zanimljivo pitanje, kakve veze id_prijave_ispita iz tabele ocena i id_ispita iz prijava_ispita imaju sa brojem indexa ?!

[ koya.90 @ 29.04.2013. 01:01 ] @
Brate posle 15 sati, desi se da coveku mozak pobrljavi!
Hvala na savetima iako su pomalo onako ostri u fazonu glupane jesi cuo za JOIN...
Naravno da jesam cuo, ali radio sam onako kako bolje znam i shvatam.
Ako je to pogresno jbg, tu ste vi da me ispravite.
Ovo sto radim je krupan zalogaj a ja nemam jos toliko iskustva, pocetnik sam.
Pre ovog rada imam samo ovaj www.studenti.vtssa.edu.rs ...
Sve u svemu los sam sa sql-om i ucim ga samo kad zatreba, sto mi je mana.

Takodje postoji covek koji ce pregledati detaljno rad i reci sta treba da se menja, popravi itd pre nego sto se postavi na server...

I resio sam problem sinoc 15min nakon sto sam postavio poruku i bio je neki drugi problem a ono sam lupio sa brojem indeksa. Upravu ste.

Znaci InnoDB da koristim a ono latin1 je dospeo putem copy paste.
Sredjujem to prvo.
Hvala poz
[ bogdan.kecman @ 29.04.2013. 01:18 ] @
za ostrinu, ja ne mislim time nista ruzno niti bilo koga podcenjujem, mozda nekad deluje ostro ali i ja sam nekad umoran :D

e sad, znam ja da si ti raio onako kako bolje znas i shvatas, zato sam ti i rekao koristi join
- em ces da ucis sintaksu i da ti doticni postaje normalan, tj polako ces ga usvojiti
- em to mnogo preglednije izgleda

sutra ako negde to budes trebao da radis za pare, veruj mi, inner join ne zavrsava posao uvek i svuda ...

sto se tice zalogaja, takav sistem nikako nije za pocetnika da napravi, posle neke 3-4 godisnje skole koja se bavi programiranjem da, na pocetku neke, nikako

vezano za "manu", zavisi cime ces se baviti u zivotu, ako zelis da zivis od programiranja, uci SQL, bez njega ces slabo za leba zaraditi

sto se tice problema, postavi resenje mozda nekom bude koristilo, no ono zbog cega nisi uspeo odma da ga resis je to sto nisi umeo da postavis pitanje kako valja (napisah ti tamo, tvoje pitanje nije imalo nikakvog smisla)

innodb - obavezno. isto tako je zgodno da definises ref.int. i da nacrtas bazu u neko er alatu (za mysql imas workbench koji je odlican i dzabe)