[ mojeKorIme @ 27.05.2008. 07:31 ] @
ovako imam sledeci upit
Code:
SELECT  c.clanskibroj,c.ime,c.prezime,c.jmbg,c.adresa,c.grad,u.iznos,u.datumuplate,
if(IFNULL(u.zaGodinu,'NE')='NE','NE','DA') as uplaceno from clanovi c left join uplate u on
c.clanskibroj=u.uplacujesifra 
where u.zaGodinu='2008' or u.zaGodinu is null group by u.zagodinu,u.uplacujesifra


Kratko objasnjenje upita bi bilo da iz tablice clanovi povuce sve clanove i ispita da li su za datu godinu uplatili clanarinu što je upisano u tablicu uplate.
Problem je što ovo radi ok za članove koji nisu nikad ništa uplatili, ali ako imam člana koji je uplatio za 2007 a nije za 2008 nikako mi se ne pojavljuje.. kako ovo riješiti da mi se članovi pojavljuju i da kod uplaceno pise DA ako su uplatili za godinu i NE ako nisu

hvala na pomoci
[ misk0 @ 27.05.2008. 07:44 ] @
Naravno, kad imas uslov where u.zaGodinu='2008'. Probaj to izbaciti (ne znam kako imas mogucnost da ti je zagodinu=null).
[ mojeKorIme @ 27.05.2008. 07:54 ] @
pa kako cu onda znati da li je uopste nesto u toj godini... treba mi da znam ko je platio u toj godini a ko nije od postojecih clanova
[ stsung @ 27.05.2008. 08:27 ] @
Pozd.

Prvo, ova konstrukcija je nepotrebno zakomplikovana:

if(IFNULL(u.zaGodinu,'NE')='NE','NE','DA')

Ovo se lepshe pishe ovako:

IF(u.zaGodinu is NULL, 'NE', 'DA')

A drugo, WHERE uslov je filtrirajuci uslov, bez obzira na vrstu JOIN-a. U tvom sluchaju, join odradi posao, medjutim ti fizichki izfiltrirash sve one koji nemaju uZaGodinu=2008. LEFT OUTER JOIN ce imati NULL vrednosti samo ako u joinovanoj tabeli nije pronadjen uslov joina.

Znachi reshenje je da uslov u.zaGodinu morash podici u uslov JOIN-a, dok u WHERE zadrzhavash samo u.zaGodinu is null.

Svako dobro.
[ mojeKorIme @ 27.05.2008. 09:41 ] @
hvala na optimizaciju if(IFNULL(u.zaGodinu,'NE')='NE','NE','DA')
ali onaj uslov nikako ne ide:(
[ Shinhan @ 27.05.2008. 09:59 ] @
Što je stsung rekao:

SELECT c.clanskibroj,c.ime,c.prezime,c.jmbg,c.adresa,c.grad,u.iznos,u.datumuplate,IF(u.zagodinu IS NULL,'NE','DA') AS uplaceno
FROM clanovi AS c
LEFT JOIN uplate AS u ON c.clanskibroj=u.uplacujesifra AND u.zaGodinu = '2008'
GROUP BY u.uplacujesifra

Samo, ja sam izbacio i u.zagodinu iz GROUP BY pošto je to redundantno. Nego, el si siguran da nećeš da sortiraš po nekom polju?

EDIT:
stsung je pogrešio ili te nije dobro razumeo. Zanemari "dok u WHERE zadrzhavash samo u.zaGodinu is null.". Vidi kod koji sam ja napisao, to sam testirao i definitivno radi.

[Ovu poruku je menjao Shinhan dana 27.05.2008. u 11:10 GMT+1]
[ stsung @ 27.05.2008. 10:17 ] @
Pozd.

Ako sam dobro razumeo, postavka zadatka glasi: Izlistaj sve chlanove iz baze, sa njihovim statusom placene chlanarine za godinu 2008. Moja greshka za WHERE uslov, zaboravio sam da trebaju svi.

Pride josh jedna napomena: uopshte nisam ni primetio da si koristio GROUP BY u upitu. Ti koristish GROUP BY za 2 polja dok ostala polja u SELECT nisu agregati. Ovakva konstrukcija je NEISPRAVNA. @Shinhan, kod tebe je takodje ovo prisutno.

Znachi finalni kod, kad vec moramo da otkrijemo konachno reshenje je:

Code:

SELECT  c.clanskibroj,c.ime,c.prezime,c.jmbg,c.adresa,c.grad,u.iznos,u.datumuplate,IF(u.zaGodinu is NULL,'NE','DA') AS uplaceno 
FROM clanovi c 
LEFT OUTER JOIN uplate u ON (c.clanskibroj=u.uplacujesifra AND u.zGodinu='2008') 


Eventualno posle ovoga neki order po prezimenu ili imenu.

Svako dobro.
[ mojeKorIme @ 27.05.2008. 10:52 ] @
to je to :) thnx