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

Najbolja pretraga baze

[es] :: MySQL :: Najbolja pretraga baze

[ Pregleda: 2985 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

oliver78
Oliver Petković
Pančevo

Član broj: 5031
Poruke: 230
*.vdial.verat.net

Sajt: oliver.glogonj.net


Profil

icon Najbolja pretraga baze29.09.2004. u 08:57 - pre 193 meseci
Da li je bilo uopšte reči o načinu i brzini pretrage baze?
Konkretno imam bazu koju treba pretražiti na osnovu 3 kriterijuma.
Posle pretrage treba prikazati samo one zapise koji zadovoljavaju bar jedan kriterijum. Uz to jedan od dva su obavezni, a treći nije.
npr. unos:
ime
preziime*
datum rođenja*

(* obavezna uneti prezime ili datum rođenja)

Ja sam to uspeo da izvedem, ali 4-5 puta prolazim sve zapise u bazi. Ima li nekog elegantijeg rešenja? (Ne koristim upit LIKE jer mi trebaju samo tačne fraze.)
Hvala!
 
Odgovor na temu

broker

Član broj: 2415
Poruke: 8514
212.62.59.*



+10 Profil

icon Re: Najbolja pretraga baze29.09.2004. u 09:54 - pre 193 meseci
Ako sam dobro razumeo jedno:

WHERE prezime = $p_prezime OR ime = $p_ime OR datum_rodjena = $p_datum

ce da resi stvar.

To koji su kriterijumi obavezni proveris pre where. Ako korisnik nije popunio neko polje vratis ga da popuni ponovo.

E sad, ovo je trivijalno tako da mi se cini da verovatno nisi dobro objasnio sta ti treba.

Sto se tice brzine, ne zaboravi da napravis indekse po ta tri polja.
 
Odgovor na temu

NetworkAdmin
Zoran Knezevic
programer u jednoj X kompaniji, radim na
daljinu online.
Beograd

Član broj: 4445
Poruke: 609
*.centrettc.ru

Sajt: www.rentalio.com


Profil

icon Re: Najbolja pretraga baze29.09.2004. u 10:13 - pre 193 meseci
ja bi na brokoerovo dodao samo jos jedan komentar da se pretpostavlja da u bazi nema '' (empty) imena.
 
Odgovor na temu

oliver78
Oliver Petković
Pančevo

Član broj: 5031
Poruke: 230
*.panet.co.yu

Sajt: oliver.glogonj.net


Profil

icon Re: Najbolja pretraga baze29.09.2004. u 17:53 - pre 193 meseci
Da nisam dobro objasnio. Sa tim upitom WHERE

Citat:
broker

WHERE prezime = $p_prezime OR ime = $p_ime OR datum_rodjena = $p_datum



dobijam sve zapise koji odgovaraju bar jednom kriterujumu. Ali, treba odabrati onaj koji zadovoljava najviše. Da li je jedino rešenje da odabrane zapise po gornjem kriterijumu smestim u novu bazu pa da povećavam kriterijum i pretražim novodobijenu (manju) bazu. Ovo pitam jer posle povećanja kriterijuma ja ponovo pretražujem celu bazu. Dosta brzo funkcioniše sa 6.000 zapisa. Pitanje je kako bi to funkcionisalo sa 100.000 zapisa?
Kriterijumi idu redom:
1. ($aPorodicno==$pPorodicno) && ($aRodjeno==$pRodjeno) && ($aDatum_r==$pDatum_r)
2.($aPorodicno==$pPorodicno) && ($aRodjeno==$pRodjeno)
3.($aPorodicno==$pPorodicno) && ($aDatum_r==$pDatum_r)
4.($aRodjeno==$pRodjeno) && ($aDatum_r==$pDatum_r)
5.($aPorodicno==$pPorodicno)
6.($aDatum_r==$pDatum_r)

Znači, ako ne nadje zapis po 1. kriterijumu pretražuje po 2., itr.
Kriterijumi mi odgovaraju, ali jedini problem je što u najgorem slučaju 6 puta pretražujem celu bazu.
 
Odgovor na temu

Shinhan
PHP programmer
Subotica

Član broj: 12327
Poruke: 372
*.com
Via: [es] mailing liste

Jabber: shinhan@elitesecurity.org
ICQ: 400847988


+4 Profil

icon Re: Najbolja pretraga baze29.09.2004. u 18:32 - pre 193 meseci
A sta mislis o:

WHERE ((($aPorodicno==$pPorodicno) && ($aRodjeno==$pRodjeno) &&
($aDatum_r==$pDatum_r)) OR (($aPorodicno==$pPorodicno) &&
($aRodjeno==$pRodjeno)) OR (($aPorodicno==$pPorodicno) &&
($aDatum_r==$pDatum_r)) OR (($aRodjeno==$pRodjeno) &&
($aDatum_r==$pDatum_r)) OR (($aPorodicno==$pPorodicno)) OR
(($aDatum_r==$pDatum_r)))

Samo proveri da li ima dovoljno zagrada.
"Common sense is not so common." - Voltaire
 
Odgovor na temu

broker

Član broj: 2415
Poruke: 8514
212.62.59.*



+10 Profil

icon Re: Najbolja pretraga baze29.09.2004. u 19:06 - pre 193 meseci
Milslim da si malo nepotrebno zakomplikovao uslov i da je dovoljno da rezultat sortiras po redosledu prezime, ime, datum rodjenja i da dobijes sasvim korisne rezultate, kao u sledecem primeru:

Code:

SELECT 
  P.*, 
  P.PREZIME=&p_prezime AS FPREZIME, 
  P.IME = $p_ime AS FIME,  
  P.DATUM=$p_datum AS FDATUM
FROM 
  PERSONAL P
WHERE 
  IME = $p_ime OR 
  PREZIME = $p_prezime OR 
  DATUM = $p_datum
ORDER BY 
  FPREZIME DESC, FIME DESC, FDATUM DESC


Na slican nacin mozes da izvedes bas te uslove koje si napisao samo moras malo da poradis na upitu. Mnogo ti je to komplikovano da se ukucava... :) Mada, kad bolje razmislim ovo daje bas redosled koji si trazio...

Da si bar dao neke testne podatke :)
 
Odgovor na temu

oliver78
Oliver Petković
Pančevo

Član broj: 5031
Poruke: 230
*.vdial.verat.net

Sajt: oliver.glogonj.net


Profil

icon Re: Najbolja pretraga baze30.09.2004. u 00:04 - pre 193 meseci
Za Shinhan-a:
Problem u ovoj pretrazi je da ako je ispunjen prvi uslov ne ide dalje. Tu se zaustavlja pretraga i daje se dobijeni rezultat. Po tvojoj pretrazi zbog OR on traži i dalje.

Za broker-a:
jel može ponovo kod sa mojim podacima?

baza mz
tabla kd
kolone u tabli porodicno, rodjeno, d_rodjenja

Ne uspevam da ga implementiram kod mene. Da li možda treba
IME = '$p_ime' OR .......

Što se tiče primera, ako zadam parametre Petar, Lazić, 15.02.1975., traži baš njega. Ako ga ne pronadje traži sve Laziće rodjene 15.02.1975., ako i takvih nema traži sve Laziće, ako i takvih nema traži sve rodjene 15.02.1975. Kažem uspeo sam to da uradim, ali više puta prolazim celu bazu i tražim elegantije rešenje. Tvoj kod mogu da iskoristim za neku brzu pretragu pa ako može pojašnjenje koda. PERSONAL? Nisam ga našao u manual-u.

Hvala još jednom. Pozdrav!

 
Odgovor na temu

Shinhan
PHP programmer
Subotica

Član broj: 12327
Poruke: 372
*.com
Via: [es] mailing liste

Jabber: shinhan@elitesecurity.org
ICQ: 400847988


+4 Profil

icon Re: Najbolja pretraga baze30.09.2004. u 08:23 - pre 193 meseci
A sta misli s o tome da rezultate iz brokerovog primera prebacis u
temp tabelu i onda tu tabelu proveravas po svakom uslovu posebno.
Ili rangiranje. Recimo, ako je tacan datum daj +4, ako je tacno
prezime daj +5, ako je tacno ime daj +2. Svi rezultati koji imaju
najveci skor su resenje.
WHERE score = MAX(score)

Rangiranje bi se isto radilo samo na temp tabeli. Update je sporiji nego select.
"Common sense is not so common." - Voltaire
 
Odgovor na temu

oliver78
Oliver Petković
Pančevo

Član broj: 5031
Poruke: 230
*.vdial.verat.net

Sajt: oliver.glogonj.net


Profil

icon Re: Najbolja pretraga baze01.10.2004. u 22:04 - pre 193 meseci
Mislim da je idejno rešenje jako dobro. Trenutno završavam neke druge segmente aplikacije i obična pretraga je dovoljno brza. Kad budem imao vremena implementiraću i ovu sa rangiranjem, ali nemam dovoljno veliku bazu da probam brzinu. U svakom slučaju prolazi se samo jednom cela baza, mora biti brže! Sigurno će koristiti i drugima koji imaju problem sa zahtevnijim upitima.
Što se tiče PERSONAL-a našao sam ga u Manual-u :-). Naravno da sam se šalio u vezi toga jer svako samo daje savete tipa: pogledaj u manual-u, izuči manual,.....
Bila je neka graška u KUCANJU koju jako umoran nisam video :-(.
Hvala na savetima.
 
Odgovor na temu

[es] :: MySQL :: Najbolja pretraga baze

[ Pregleda: 2985 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

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