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

Problem sa like klauzulom u proceduri

[es] :: MySQL :: Problem sa like klauzulom u proceduri

[ Pregleda: 1811 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

biske86
Ivan Biševac
Zubin Potok

Član broj: 62435
Poruke: 979
*.dynamic.isp.telekom.rs.

Sajt: biske.rs


+39 Profil

icon Problem sa like klauzulom u proceduri09.07.2010. u 09:50 - pre 168 meseci
Imam sledecu proceduru za pretragu:

Code:
DELIMITER $$

CREATE DEFINER=`root`@`%` PROCEDURE `SP_PRETRAZI_NASTAVNIKA`(IN ime varchar(25), IN prezime varchar(35), IN katedra varchar(40), IN zvanje varchar(25))
BEGIN
set names utf8;

SELECT n.ime as ime, n.prezime as prezime, z.naziv as zvanje, k.naziv as katedra, f.naziv as funkcija, ra.naziv as angazovanje
FROM ((((((((NASTAVNIK N LEFT JOIN NASTAVNIK_ZVANJE NZ ON N.NastavnikID=NZ.NastavnikID) LEFT JOIN
    ZVANJE Z ON z.zvanjeId=nz.zvanjeid) LEFT JOIN
    KATEDRA K ON K.Katedraid=N.KatedraID) LEFT JOIN
    NASTAVNIK_RADNO_ANGAZOVANJE NRA ON NRA.NastavnikID=N.NastavnikID) LEFT JOIN
    RADNO_ANGAZOVANJE RA ON RA.TipRadnogAngazovanjaID=NRA.TipRadnogAngazovanjaID) LEFT JOIN
    NASTAVNIK_FUNKCIJA NF ON NF.NastavnikID=N.NastavnikID) LEFT JOIN
    FUNKCIJA F ON F.FunkcijaID=NF.FunkcijaID))
    WHERE (N.ime like concat(ime,'%')) and (N.prezime like concat(prezime,'%')) and (k.naziv like concat(katedra,'%')) and (z.naziv like concat(zvanje,'%'));    
END


Na pocetku sam krenuo da stavim za like 'ime%' ali nije procedura radila. Na internetu sam našao da treba da ubacim CONCAT(ime,"%").

Kad ukucam:

Code:
CALL SP_PRETRAZI_NASTAVNIKA('','','','');


procedura mi daje sledeci izlaz:




A trebalo bi da daje sledece:



Posumljao sam da problem prave NULL vrednosti u koloni zvanje. Nema mnogo iskustva sa mysql-om pa molim za pomoc.
Prikačeni fajlovi
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Problem sa like klauzulom u proceduri09.07.2010. u 10:50 - pre 168 meseci
Jeste, problem ti je sa null.
Ako je polje null onda polje like '%' ne vraća true nego false ili null (mrzi me da pogledam šta je tačno rezultat, ali u svakom slučaju nije true).

Ovo se rešava tako što svaki relacioni iskaz:

polje like concat(parametar, '%')

napišeš kao:

(polje like concat(parametar, '%') or (polje is null and parametar is null))
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Problem sa like klauzulom u proceduri09.07.2010. u 11:00 - pre 168 meseci
Moram da primetim da mi na osnovu tvoja dva pitanja koja se, verovatno, tiču istog projekta ne sviđa ono što radiš.

Recimo u onom prethodnom pitanju gde si proveravao privilegije na menijima, to je loše odrađeno. Ja bih, recimo, usvoji pretpostavku ili da je pristup svakom meniju (odnosno operacijama select, updata, delete) implicitno zabranjen ili implicitno dozvoljen (zabranjen bi bio moj izbor), pa bih onda u tabelu privilegija pisao samo dozvole.

U slučaju da je potrebno znati i kada je neko dobio ili izgubio dozvolu, vodio bih evidenciju u posebnoj audit tabeli. Bez obzira što upit nije sam po sebi suviše kritičan, postoji ozbiljna opasnost da prouzrokuje loše performanse aplikacije, jer bi se pozivao puno puta u aplikaciji.

U ovom tvom drugom primeru, praviš monstruozne joinove da bi pretražio tekstualne podatke u više tabela.
Opet, ja ne bih tako radio. Ili bih napravio keyword list ili bih ovaj upit za pretragu podataka dinamički kreirao u zavisnosti od toga koje parametre dobijem.

Mislim da bi trebao malo da razmisliš o konceptima projekta, pre nego što naletiš na još neku džombu.
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Problem sa like klauzulom u proceduri09.07.2010. u 11:17 - pre 168 meseci
Još jedno zapažanje:

Da li nastavnik može da ima više od jednog zvanja u jednom momentu?
Ako je odgovor NE onda je tabela NASTAVNIK_ZVANJE suvišna, nego idzvanja treba da ide u tabelu nastavnik.

Da li nastavnik može da bude na više od jedne katedre?

Da li nastavnik može da bude na više od jednog radnog angažovanja? (nemam pojma šta ti je to, ali verovatno može...)
 
Odgovor na temu

biske86
Ivan Biševac
Zubin Potok

Član broj: 62435
Poruke: 979
*.dynamic.isp.telekom.rs.

Sajt: biske.rs


+39 Profil

icon Re: Problem sa like klauzulom u proceduri09.07.2010. u 14:24 - pre 168 meseci
Code:
-- --------------------------------------------------------------------------------
-- Routine DDL
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE DEFINER=`pravni`@`localhost` PROCEDURE `SP_PRETRAZI_NASTAVNIKA`(IN pime varchar(25), IN prezime varchar(35), IN katedra varchar(40), IN zvanje varchar(25))
BEGIN
set names utf8;

SELECT n.ime as ime, n.prezime as prezime, z.naziv as zvanje, k.naziv as katedra
FROM ((((((((NASTAVNIK N left JOIN NASTAVNIK_ZVANJE NZ ON N.NastavnikID=NZ.NastavnikID) inner JOIN
    ZVANJE Z ON z.zvanjeId=nz.zvanjeid) inner JOIN
    KATEDRA K ON K.Katedraid=N.KatedraID) left JOIN
    NASTAVNIK_RADNO_ANGAZOVANJE NRA ON NRA.NastavnikID=N.NastavnikID) left JOIN
    RADNO_ANGAZOVANJE RA ON RA.TipRadnogAngazovanjaID=NRA.TipRadnogAngazovanjaID) left JOIN
    NASTAVNIK_FUNKCIJA NF ON NF.NastavnikID=N.NastavnikID) inner JOIN
    FUNKCIJA F ON F.FunkcijaID=NF.FunkcijaID))
    WHERE (n.ime like concat(pime,'%') or (n.ime is null and pime is null));
    
END



Kad pozovem:

Code:
call sp_pretrazi_nastavnika('','','','');


daje mi sledeći izlaz:



A trebalo bi da mi da 3 reda.
Možda je problem u nepravilnoj upotrebi LEFT i RIGHT JOINA.
Prikačeni fajlovi
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Problem sa like klauzulom u proceduri09.07.2010. u 14:30 - pre 168 meseci
Ja sam ti napisao da SVAKI uslov u where klauzuli dopuniš sa OR delom

dakle umesto:
Code (sql):

WHERE (N.ime LIKE concat(Pime,'%'))
    AND (N.prezime LIKE concat(Pprezime,'%'))
    AND (k.naziv LIKE concat(Pkatedra,'%'))
    AND (z.naziv LIKE concat(Pzvanje,'%')
 


treba

Code (sql):

WHERE (N.ime LIKE concat(Pime,'%')            OR (N.ime IS NULL AND Pime IS NULL))
    AND (N.prezime LIKE concat(Pprezime,'%') OR (N.prezime IS NULL AND Pprezime IS NULL))
    AND (k.naziv LIKE concat(Pkatedra,'%')     OR (k.naziv IS NULL AND Pkatedra IS NULL))
    AND (z.naziv LIKE concat(Pzvanje,'%')      OR (Z.naziv IS NULL AND Pzvanje IS NULL)
 


Što se tiče JOINA, probaj da izvršiš upit bez WHERE uslova, pa da vidiš da li dobijaš ono što treba. Ne mogu ovako napamet da pogađam da li si dobro stavio LEFT i INNER tamo gde treba...

Uh, dok sam pisao ispravan SQL koda nisam mogao da ne primet jednu užasnu stvar, a to je da ti se ulazni parametri procedure zovu isto kao polja u tabeli. Daj, stavi neki prefiks, na primer My ili In ili P tako da znaš da je "Pime" ulazni parametar a "ime" polje u tabeli...

PS sada vidim da si to uradio u drugom upitu, čudim se kako je išta dao u prethodnom slučaju.
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Problem sa like klauzulom u proceduri09.07.2010. u 14:57 - pre 168 meseci
Ovako bi bilo brže, a davalo bi iste rezultate:

Code (sql):

WHERE (Pime IS NULL OR N.ime LIKE concat(Pime,'%'))
    AND (Pprezime IS NULL OR N.prezime LIKE concat(Pprezime,'%'))
    AND (Pkatedra IS NULL OR k.naziv LIKE concat(Pkatedra,'%'))
    AND (Pzvanje IS NULL OR z.naziv LIKE concat(Pzvanje,'%'))
 


 
Odgovor na temu

biske86
Ivan Biševac
Zubin Potok

Član broj: 62435
Poruke: 979
*.dynamic.isp.telekom.rs.

Sajt: biske.rs


+39 Profil

icon Re: Problem sa like klauzulom u proceduri09.07.2010. u 18:25 - pre 168 meseci
Code (sql):

-- --------------------------------------------------------------------------------
-- Routine DDL
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE DEFINER=`pravni`@`localhost` PROCEDURE `SP_PRETRAZI_NASTAVNIKA`(IN pime VARCHAR(25), IN pprezime VARCHAR(35), IN pzvanje VARCHAR(25),  IN pkatedra VARCHAR(40))
BEGIN
SET names utf8;

SELECT n.ime AS ime, n.prezime AS prezime, z.naziv AS zvanje, k.naziv AS katedra, f.naziv AS funkcija, ra.naziv AS radnoangazovanje
FROM ((((((((NASTAVNIK N LEFT JOIN NASTAVNIK_ZVANJE NZ ON N.NastavnikID=NZ.NastavnikID) LEFT JOIN
    ZVANJE Z ON z.zvanjeId=nz.zvanjeid) LEFT JOIN
    KATEDRA K ON K.Katedraid=N.KatedraID) LEFT JOIN
    NASTAVNIK_RADNO_ANGAZOVANJE NRA ON NRA.NastavnikID=N.NastavnikID) LEFT JOIN
    RADNO_ANGAZOVANJE RA ON RA.TipRadnogAngazovanjaID=NRA.TipRadnogAngazovanjaID) LEFT JOIN
    NASTAVNIK_FUNKCIJA NF ON NF.NastavnikID=N.NastavnikID) LEFT JOIN
    FUNKCIJA F ON F.FunkcijaID=NF.FunkcijaID))
    WHERE (n.ime LIKE concat(pime,'%') OR pime IS NULL OR pime='') AND (n.prezime LIKE concat(pprezime,'%') OR pprezime IS NULL OR pprezime='') AND (z.naziv LIKE concat(pzvanje,'%') OR pzvanje IS NULL OR pzvanje='') AND (k.naziv LIKE concat(pkatedra,'%') OR pkatedra IS NULL OR pkatedra='');
   
END
 


Samo sam još dodao or ppolje=" i sada radi. Pored toga stavio sam svuda LEFT JOIN mada mislim da može između nekih tabela da se zameni sa RIGHT JOIN.
Kad smo već kod toga da li se razlikuju u performansama LEFT JOIN i RIGHT JOIN?





 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Problem sa like klauzulom u proceduri09.07.2010. u 18:39 - pre 168 meseci
Citat:
djoka_l: Moram da primetim da mi na osnovu tvoja dva pitanja koja se, verovatno, tiču istog projekta ne sviđa ono što radiš.


vidis da su resili da zamene upite stored procedurama :( i to bukvalno, umesto da pisu upit oni pisu proceduru bez ikakve logike sa potpuno pogresnim data modelom .. al obzirom da je izgleda neka interna skolska stvar u pitanju verovatno imaju nekog morona za mentora/profesora koji im je lelemudio kako "tako treba" i oni sad moraju "kako je profa reko" bez obzira koliko to sve nema smisla .. a profa je u zivotu modelirao 2 baze, jednu za video klub i jednu za telefonski imenik a misli da je uvatio boga za... (biske86, nije na tvoj racun, nisi ti kriv sto si u zemlji gde u prosvetu idu najgori)

Citat:
biske86: Kad smo već kod toga da li se razlikuju u performansama LEFT JOIN i RIGHT JOIN?


razlikuju se, right join pravi drugu vrstu mnozenja te uglavnom ima veci rezultat samim tim je sporiji ali to je kao da pitas da li je brzi traktor ili automobil .. ako budes traktorom isao u grad bice sporo i ne bas udobno, dok ako kolima budes probao da ores lose ces da prodjes ... najgore su ti performanse ako budzis left join da ti vrati rezultat koji vraca right join i obrnuto
 
Odgovor na temu

biske86
Ivan Biševac
Zubin Potok

Član broj: 62435
Poruke: 979
*.dynamic.isp.telekom.rs.

Sajt: biske.rs


+39 Profil

icon Re: Problem sa like klauzulom u proceduri09.07.2010. u 22:29 - pre 168 meseci
Nije lepo da vređamo čoveka o kome ne znamo ništa, čak ni ime i prezime.

Ali nevezano za to hvala vam na odgovorima.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Problem sa like klauzulom u proceduri10.07.2010. u 07:19 - pre 168 meseci
nije vredjanje, na zalost to da u prosvetu idu ubedljivo najgori je mnogo ruzna cinjenica :( - cast izuzetcima .. a to za 2 baze - to je pretpostavka da se takav covek nalazi na takvom mestu (a na zalost je u 90% slucajeva tako, posebno kada je IT u pitanju) - no kako je virtualni covek u pitanju nema ko da se vredja.. mozda je on super pametan i dobar strucnjak ali los pedagog pa vi niste svatili sta je hteo da vam kaze / nije umeo da prenese znanje, mozda ste mislili o sojkama dok je on pricao o tome cemu sluze sp .. no to je potpuno van konteksta .. i 90% slucajeva, on ima manje iskustva u tome sto predaje od osrednjeg srednjoskolca koga to zanima

sto se pitanja i odgovora tice, samo ti udri :) to sto se tebi cini kao "pocetnicka pitanja" - dobrih 30% ljudi koji citaju ovaj forum isto tako ne ume da resi (a blam ih je da pitaju) a dodatno 10% misli da ume, tako da je potpuno nebitno da li su pitanja "pocetnicka" - sve sto imas ti pitaj a ostali ce da se potrude da odgovore i samim tim i onih 30% "uplasenih" ce da nauci nesto. Ja sebi dajem za pravo da ti uz odgovor dopisem stvari tipa za onaj limit za proceduru - moze ali nema smisla, tome ne sluze stored procedure ... ali opet, moze i imas tamo kako se to radi.. isto tako cu da ti spominjem nelogicnosti samog mysql-a (mysql neke stvari radi namerno pogresno, neke slucajno pogresno a neke prosto drugacije .. neke "klasicne" postavke koje vaze za rdbms za mysql ne vaze uvek etc etc .. da ne smaram .. )
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Problem sa like klauzulom u proceduri11.07.2010. u 00:38 - pre 167 meseci
Dobro, i ja sam bio pomalo grub.
Kada se setim svojih fakultetskih projekata, to nije nešto što bih uramio i okačio na zid.
A sa nekima od tih profesora koji su mi na fakultetima davali dobre ocene imao sam prilike kasnije da profesionalno sarađujem i da vidim da znaju posao. Možda je profesor namerno pustio bisketa da se sam iskobelja sa data modelom koji je biske napravio na početku, pa mu je interesantnije da vidi kako će se snaći nego da projekat bude besprekoran...
 
Odgovor na temu

[es] :: MySQL :: Problem sa like klauzulom u proceduri

[ Pregleda: 1811 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

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