Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Kreiranje malo slozenijeg upita

[es] :: MySQL :: Kreiranje malo slozenijeg upita

[ Pregleda: 2479 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

vbbojan
Atanasijevic Bojan
Digit Consulting d.o.o.
Beograd

Član broj: 31580
Poruke: 273
194.106.181.*

Sajt: www.digitconsulting.rs


+20 Profil

icon Kreiranje malo slozenijeg upita23.12.2007. u 18:37 - pre 198 meseci
Imam sledeći problem i zelim da ako je moguce da se resi elegantno sa jednim SQL upitom:
Server je MySQL 4....
(struktura podataka je uproscena zbog preglednosti)
Code:

Tabele:

radnici
---------------------
radnikID
ime
prezime

firme
---------------------
firmaID
naziv

staz
---------------------
radnikID
firmaID
datum_od
datum_do

Elem, svaki radnik ima istoriju radnog staža, na primer:
Code:

radnikID   firmaID   datum_od        datum_do
------------------------------------------------
0001       0001      2000-01-01     2000-12-31
0001       0002      2001-01-01     2001-12-31
0002       0003      1990-01-01     1999-12-31
0002       0004      2000-01-01     0000-00-00
0003       0002      2000-01-01     0000-00-00


Deklarisano je pravilo:
Ako je polje datum_do NULL ili ti '0000-00-00' onda je radnik u radnom odnosu.

Pitanje glasi:
Kako dobiti radnike koji nisu u radnom odnosu?

Hvala unapred i pozdrav.
 
Odgovor na temu

vbbojan
Atanasijevic Bojan
Digit Consulting d.o.o.
Beograd

Član broj: 31580
Poruke: 273
194.106.181.*

Sajt: www.digitconsulting.rs


+20 Profil

icon Re: Kreiranje malo slozenijeg upita23.12.2007. u 23:30 - pre 198 meseci
Prilično sam neiskusan sa SQL-om, ali mi je veoma interesantno pa sam
zapeo i došao do sledećeg rešenja sa subquery upitom.
Kad sam postavio problem sve mi je izgledalo prilično zapetljano,
a u stvari je jednostavno.

Odgovorih sam sebi, možda pomogne još ponekome...
Code:

SELECT DISTINCT staz.radnikID
FROM            staz
WHERE           staz.radnikID NOT IN 
               (SELECT DISTINCT staz.radnikID FROM staz WHERE datum_do = '0000-00-00');

Ovo radi, ali nemam pojma koliko je optimalno ...

Naravno, verovatno može i bolje. Ima li ko još kakvih ideja.

Pozdrav svima.
 
Odgovor na temu

vilyu
Web Developer
Beograd, Srbija

Član broj: 1188
Poruke: 444



+2 Profil

icon Re: Kreiranje malo slozenijeg upita24.12.2007. u 13:47 - pre 198 meseci
Zapravo veoma jednostavno. Uslov je da polje datum_do bude vece od 0000-00-00. Ukoliko je polje NULL, ono svejedno mora da se proverava sa IS NULL, tako da se NULL rezultati nece pojaviti u ovakvom upitu.

Upit bi mogao da glasi:
Code:

SELECT * FROM radnici
WHERE radnikID IN (
    SELECT radnikID FROM staz
    WHERE datum_do > '0000-00-00'
)

Ili neka kombinacija sa JOIN.
Pera električar 0637129710, BG, preporučujem.
 
Odgovor na temu

Jbyn4e

Član broj: 422
Poruke: 6049
*.ptt.yu.



+257 Profil

icon Re: Kreiranje malo slozenijeg upita24.12.2007. u 22:44 - pre 198 meseci
hm, meni deluje da moze...

Code:

select r.ime, r.prezime from radnici r, firme f, staz s where r.radnikID = s.radnikID and f.firmaID = s.firmaID and s.datum_do > '0000-00-00'


Probaj pa javi.
Kad sve ostalo zakaže, pročitaj uputstvo...
 
Odgovor na temu

vbbojan
Atanasijevic Bojan
Digit Consulting d.o.o.
Beograd

Član broj: 31580
Poruke: 273
194.106.181.*

Sajt: www.digitconsulting.rs


+20 Profil

icon Re: Kreiranje malo slozenijeg upita25.12.2007. u 15:47 - pre 198 meseci
Hvala svima na pomoci.

A sad malo kritike, nista zlonamerno, sve je u cilju unapredjenja opsteg znanja.
Na greskama se covek dobro nauci.


@vbbojan - sam sebi prvo!

Upit radi na mojoj lokalnoj bazi, ali za rad sa test primerom nije ispravan i trebalo bi da glasi:
Code:

SELECT DISTINCT staz.radnikID
FROM            staz
WHERE           staz.radnikID NOT IN 
               (SELECT DISTINCT staz.radnikID FROM staz WHERE datum_do IS NULL);

WHERE izraz u subquery delu upita nije radio kako treba, kad se polje testira da li
je NULL sve radi kako treba.


@vilyu

Tvoj upit vraca sve radnike koji imaju imaju u polju datum_do upisanu vrednost.
Odnosno konkretno po primeru su to radnici 0001 i 0002, ali radnik 0002 je u radnom
odnosu jer ima i sledeći zapis gde je polje datum_do NULL

Moja greska je sto nisam naglasio, ali se iz primera moze videti da
je radnik 0001 bio na dva mesta u radnom odnosu, ali da sada nije u radnom odnosu
i da je radnik 0002 u radnom odnosu, ali i da je ranije bio u još jednoj firmi u radnom odnosu.

(by the way, uspesno resenje treba da vrati kao rezultat radnika 0001)


@Jbyn4e
Tvoj upit takođe vraća dva radnika: 0001 i 0002, opet je u pitanju previd
da radnik u svojoj karijeri može raditi na više mesta.


Još jednom hvala svima, oba vaša upita se mogu lako prepraviti da vrate
pravi rezultat i dali su mi ideju kako da napravim upit koji koristim u programu
da bude jos bolji.

Pozdrav.
 
Odgovor na temu

[es] :: MySQL :: Kreiranje malo slozenijeg upita

[ Pregleda: 2479 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.