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

Pretraga baze po vise OR i AND upita (problem)

[es] :: MySQL :: Pretraga baze po vise OR i AND upita (problem)

Strane: 1 2

[ Pregleda: 6328 | Odgovora: 36 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

nkrgovic
Nikola Krgović
Beograd

Član broj: 3534
Poruke: 2807

ICQ: 49345867
Sajt: https://www.twinstarsyste..


+655 Profil

icon Re: Pretraga baze po vise OR i AND upita (problem)20.06.2018. u 08:16 - pre 70 meseci
Ako ima 10,000 poseta DNEVNO, tj. ako ima jedan upit na 10s, onda moz' da nogama programira, stoji. :) Ali ovde su u pitanju best practices, ovo je forum. :)
Please do not feed the Trolls!

Blasphemy? How can I blaspheme? I'm a god!'
 
Odgovor na temu

Deunan

Član broj: 338178
Poruke: 83
*.dynamic.isp.telekom.rs.



+21 Profil

icon Re: Pretraga baze po vise OR i AND upita (problem)20.06.2018. u 10:33 - pre 70 meseci
Posteno, uvek je tesko odgovoriti na ovakva pitanja gde je vec pocet posao, a priblizio se rok.
Zakomplikovace mnogo izdvajanjem reci za pretragu u poseban table. Svaki novi unos proizvoda, mora da doda nove reci. Svaka promena imena, morace da promeni i reci. A ako slucajno bude morao jos jedan jezik... ludnica.

Odradio sam par brzih testova pa nek odluci (table od 4 kolone sa random recima bez indexiranja):

SELECT * FROM test WHERE name LIKE '%word1%' AND name LIKE '%word2%'...

110 001 total rows
2 reci: (7779 total, Query took 0.0007 seconds.)
3 reci: (428 total, Query took 0.0061 seconds.)
4 reci: (13 total, Query took 0.0790 seconds.)
5 reci: (i.e. zero rows). (Query took 0.0787 seconds.)


604 090 total
1 rec: (63 total, Query took 0.1912 seconds.)
2 reci: (47 total, Query took 0.3316 seconds.)
3 reci: (16 total, Query took 0.4148 seconds.)

10 000 artikala je smesna cifra za mysql. Ne znam, ja to ne bih radio da ustedim par milisekundi...

 
Odgovor na temu

VladaSu

Član broj: 31634
Poruke: 1099
*.tippnet.co.rs.



+218 Profil

icon Re: Pretraga baze po vise OR i AND upita (problem)20.06.2018. u 11:18 - pre 70 meseci
O tome pricam, a cisto sumnjam da ce imati vise od 10.000 artikala. To ne znaci da je u njegovom slucaju LIKE toliko los i ne znaci da je programirano nogama. Za taj slucaj je to sasvim pristojno.
Sledece sto bih uradio je da bih rezultate prikazao po "tezini" tj ako se pretrazuju tri reci onda bi prvo prikazao rezultate sa po sve tri reci, onda rezultate sa prve dve reci, pa drugom i treceom, pa prvom i trecem i na kraju dodao i rezultat
sa samo prvom reci, pa samo drugom pa samo trecom. Naravno ne ponavljati iste rezultate. To je 7 sql-ova koji su za toliko poseta i toliko artikala vrlo "lagani". Sem toga search se ne koristi stalno. Mozda ne biih ulazio u drugi, treci i x sql ako ima zadovoljavajuci broj rezultata jer ce korisnik imati vec dovoljno kvalitetan rezultat i dozivljaj.
[Ovu poruku je menjao VladaSu dana 14.06.2003. u 11:22 GMT+1]
 
Odgovor na temu

VladaSu

Član broj: 31634
Poruke: 1099
*.tippnet.co.rs.



+218 Profil

icon Re: Pretraga baze po vise OR i AND upita (problem)20.06.2018. u 11:39 - pre 70 meseci
Ajmo sada na kod
Code (php):


           $sql = array();
           $words = array('futrola','futrole','torbica');
       foreach($words as $word){
        $sql[] = '(lower(naziv) LIKE \'%'.$word.'%\')';
       }
           $limit = 48;
       if($arg3 == ""){
          $arg3 = 0;
       }
       $offset = $arg3*48;
       $sqlNumRows ='SELECT * FROM artikli WHERE '.implode(" OR ", $sql).' ORDER BY id DESC';
       $sql = 'SELECT * FROM artikli WHERE '.implode(" OR ", $sql).' ORDER BY id DESC LIMIT '.$limit.' OFFSET '.$offset;
       $poslednjih10 = $oDb->get_results($sql);
       $brRezultata = $oDb->num_rows($sqlNumRows);
 

1. Posto nemas kategorije definisane ne znam sta se petljas pa zamisljas kategorije? Lepo radis kao i da ne postoje kategorije jer ce rezultat biti isti.
2. Pretpostavljam da $words vadis iz baze ali na osnovu cega? Odkuda znas da ce on ukucati prvo rec "futrola"? Mozda ukuca "teget Iphone futrola". Onda je po tebi "teget" kategorija? Zato kazem batali kategorije ako ih vec nemas.
3. Tvoja pretraga "Futrola x345 za Apple iPhone 7 teget" moze biti i "teget fFutrola x345 za Apple iPhone 7" i tu sada dolazimo do onog $words. Ti si pretpostavio da nalazis slicne reci samo za "futrolu" ali mozes i za "teget" i za Apple (neko ce napisati aple).
Onda se gubi poenta tvojih virtuelnih kategorija. Za svaku rec u search string ces morati da nadjes slicne i da ih ubacis u $words. Ako ces raditi search onako sa vise sql-ova da rezultat bude po nekom kvalitetu onda ces morati imati $words kao multidimenzionalan array.
4. Lower i izbacivanje slova sa kukicama resi na nivou baze ili tabele.
5. sqlNumRows koristi SQL_CALC_FOUND_ROWS ako ti se pokaze brze. Testiraj.
6. Ti covece ne koristis neki FW?
7. Koji je djavo ovo $offset = $arg3*48; odakle ti 48? Pa valjda je $offset = $arg3*$limit;
8. implode(" OR ", $sql). valjda je logicnije nesto kao implode(" OR ", $where).
9. Sada kada sam malo bolje pogledao kod zaboravi na onu mogucnost da imas rezultat po tezini jer ce ti biti komplikovano.

zamislio si idealan slucaj pretrage i sada ocekujes da svi tako kucaju pretragu.
[Ovu poruku je menjao VladaSu dana 14.06.2003. u 11:22 GMT+1]
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.com
Via: [es] mailing liste

Sajt: mysql.rs


+2377 Profil

icon Re: Pretraga baze po vise OR i AND upita (problem)20.06.2018. u 12:54 - pre 70 meseci
mysql na shared hostingu je vec opterecen, on kad uradi full table scan
nad kakvom god tabelom to zabada IO do prekosutra.. ti imas 0.00 zato
sto ti je cela ta tabela u innodb buffer pool-u, sansa da je njegova
tabela u baferu mysql-a na shared hostingu je priblizno ista kao da ja
skinem 70kg do kraja meseca ... da ne spominjem da ce na preko 80%
shared hosting sistema full table scan upit da bude killnut skriptom na
keca... tabela od preko nekoliko desetina slogova ne sme se pretrazuje
sa full table scan-om... posebno ne kada postoje jednostavna resenja da
se to zaobidje

triger resava problem sa insert/update/delete to uopste nije
komplikacija napise se za par sati (ili prepise iz nekog vec gotovog
resenja) a samim postojanjem te dodatne tri tabele moze da radi hinting
ultra brzo bez da opterecuje tabelu, doda killer feature svojim
korisnicima i ubrza sistem

da ne spominjem da paljenje full text indexa resava 99% njegovih
problema, tih par reci sto su ispod 4 slova moze da trazi sa like kada
vec po indexu smanji result set na par slogova
 
Odgovor na temu

Deunan

Član broj: 338178
Poruke: 83
*.dynamic.isp.telekom.rs.



+21 Profil

icon Re: Pretraga baze po vise OR i AND upita (problem)20.06.2018. u 13:19 - pre 70 meseci
Prvi test je radjen na domacem shared hostingu (Hetzner original), drugi na najjeftinijem digitalocean dropletu.

Koji to hosting ne dozvoljava pretragu? Imam neke naloge skoro kod svih, pa da istestiram. Valjace mi da znam za ubuduce. Svaki dan se nesto novo nauci...

 
Odgovor na temu

VladaSu

Član broj: 31634
Poruke: 1099
*.tippnet.co.rs.



+218 Profil

icon Re: Pretraga baze po vise OR i AND upita (problem)20.06.2018. u 13:29 - pre 70 meseci
Bogdane. Slazem se sa tobom da ima boljih resenja ali ja imam projekat star 10 i vise godina na shared hostingu sa ~10.000 rekorda. Svaki klik na neki link sa home strane je neka slicna pretraga sa LIKE i stranice se super brzo ucitavaju.
Za tih 10 godina prvi hosting je bio hostgator, pa exehost, pa eunet i orion.
Sem toga sudeci po prikazanom kodu sumnjam da je u stanju da napravi ovako nesto sto predlazes, pogotovo zato sto je u frci sa vremenom.
Kazes da par reci sto su ispod 4 slova moze da trazi sa like kada dobije result set ali je problem sto se u result setu nece sadrzati rezultate sa recimo od ta 3 slova. Uvek ce taj dodatni LIKE biti bez rezultata sem slucajno ako se zadesi tu taj rekord na osnovu nekog drugog kriterijuma.


[Ovu poruku je menjao VladaSu dana 14.06.2003. u 11:22 GMT+1]
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.com
Via: [es] mailing liste

Sajt: mysql.rs


+2377 Profil

icon Re: Pretraga baze po vise OR i AND upita (problem)20.06.2018. u 13:55 - pre 70 meseci
@deunan, 1europe ili kako se zove, kill svaki io hungry upit posle 1sec
na primer .. od ovih evropskih, od sveCkih skoro svi ovi sto daju za
5-15E godisnje hosting


@vladasu, vidi moze da zaposli za dovoljno malo posetilaca i dovoljno
malu bazu i 2 napredne i nazadne plavuse da direktno kucaju odgovore ..
pricamo o resenjima koja imaju smisla ... resenje sa LIKE kroz 10k
slogova nije ok resenje cak i na tvom sopstvenom bare metal hostingu....
like se koristi za analizu u upitima koji se tuku jednom dnevno ili
jednom mesecno, ne u upitu koji se nalazi na html strani koja moze da se
pozove milion puta dnevno...

nebi cenio njegove mogucnosti po prikazanom tudjem kodu, ja verujem da
on to ume da napravi a ako ne ume da napravi ume da iskopira (eno ga
phpbb moze iskopira ceo taj deo odatle, ne secam se dal koriste stored
procedure i trigere da odrzavaju index tabele ili to rade iz php-a ali
sta god da je moze se iskopira npr od njih) ..

vreme .. pa nema boljeg nacina za ucenje nego resavanje takvog problema
sa kratkim deadline-om :D

za match + like sam mislio za AND ... za OR .. nemam ideju da bi neko
trazio sve slogove u bazi koji imaju 2 slova jedan pored drugog malo to
nema smisla?! valjda je poenta da uradis and svega sto je covek ukucao u
search polje?
 
Odgovor na temu

Aleksandar Klickovic
Owner
Daedalus Outsourcing
Beograd

Član broj: 204183
Poruke: 344
*.dynamic.sbb.rs.

Sajt: petsq.me


+67 Profil

icon Re: Pretraga baze po vise OR i AND upita (problem)20.06.2018. u 18:48 - pre 70 meseci
Fino se razvila diskusija, pa da dam mali update, vidim da ima par pitanja..

Search je vec odradjen sa like.. jer tu imam samo uporedjivanje da li string ima zadate reci.. i to mi radi veoma brzo, jer je mala baza.. nece ici vise od 20k artikala..

Kategorije su bile potrebne zbog navigacije.. Klijent hoce da ima navigaciju koja mu odvaja futrole od punjaca itd.. a zatim da ih sortira po marki telefona.

Elem, napisao sam gore, napravio sam sam kategorije u bazi za 20 min, jer ih nema puno. a onda te rezultate dalje uporedio sa modelima telefona i za sad sve radi kako bi trebalo..

mogu da iskopiram deo koda.

Code:


       <?php
        if($arg2 == "futrole" || $arg2 == ""){
    ?>
        <h2>Futrole</h2>
        <div class="row">
            <?php 
            $sql = array();
            if($arg4 != ''){
                $words = explode("-",$arg4);
                $n = count($words);
                if($n > 1) {
                  $wordsArr = implode(' ', array($words[1], $words[$n-1]));
                } else {
                  $wordsArr = $words[1];
                }
                $words = explode(" ",$wordsArr);
                foreach($words as $word){
                    $sql[] = '(lower(naziv) LIKE \'%'.$word.'%\')';
                }
            }
            if($arg2 == "futrole"){
                $limit = 48;
                if($arg3 == ""){
                    $arg3 = 0;
                }
                $offset = $arg3*48;
                if($arg4 != ''){
                    $sqlNumRows ='SELECT * FROM artikli WHERE kategorija = "Futrole" AND '.implode(" AND ", $sql).' ORDER BY id DESC';
                    $sql = 'SELECT * FROM artikli WHERE kategorija = "Futrole" AND '.implode(" AND ", $sql).' ORDER BY id DESC LIMIT '.$limit.' OFFSET '.$offset;
                } else {
                    $sqlNumRows ='SELECT * FROM artikli WHERE kategorija = "Futrole" ORDER BY id DESC';
                    $sql = 'SELECT * FROM artikli WHERE kategorija = "Futrole" ORDER BY id DESC LIMIT '.$limit.' OFFSET '.$offset;
                }
                $poslednjih10 = $oDb->get_results($sql);
                $brRezultata = $oDb->num_rows($sqlNumRows);
                $newArg3 = $arg3 + 1;
                $prevArg3 = $arg3 - 1;
                $brStrana = floor($brRezultata/$limit);
            } else {
                $sql = 'SELECT * FROM artikli WHERE kategorija = "Futrole" ORDER BY id DESC LIMIT 4';
                $poslednjih10 = $oDb->get_results($sql);
            }
            foreach($poslednjih10 as $artikal10){
                $artikalId = $artikal10['id'];
                $artikalSifra = $artikal10['sifra'];
                $artikalNaziv = $artikal10['naziv'];
                $artikalCena = round(0.8*$artikal10['mpCena'],2);
                list( $slikaUrl ) = $oDb->get_row( "SELECT slikaUrl FROM artikliSlike WHERE sifra = $artikalSifra LIMIT 1" );
                if (!is_readable(SITE_PATH . '/uploads/artikli/'.$slikaUrl)) {
                   $slikaUrl = 'default.png';
                }
                if($slikaUrl == ""){$slikaUrl = 'default.png';}
                        ?>
                        <div class="col col-6 col-lg-3">
                            <a href="<?php echo SITE_URL; ?>/proizvodi/proizvod/<?=$artikal10['id']."-".$oLogin->PrettyUrl($artikalNaziv);?>"><img src="<?php echo SITE_URL; ?>/uploads/artikli/<?php echo $slikaUrl;?>" class="img-fluid center-block" alt="<?=$artikalNaziv;?>"></a>
                            <div class="text-center">
                                <h3 style="font-weight:normal;font-size:13px;"><?=$artikalNaziv;?></h3>
                                <p><strong><?=$artikalCena;?> RSD</strong></p>
                                <form action="<?php echo SITE_URL; ?>/proizvodi/proizvod/<?=$artikal10['id']."-".$oLogin->PrettyUrl($artikalNaziv);?>">
                                    <button type="submit" class="btn btn-sm btn-outline-dark">Poruči</button>
                                </form>
                                <p></p>
                            </div>
                        </div>
                        <?php
            } 
            if ($arg2 == "futrole"){
            ?>
            <div class="col-12 text-center">
                <hr>
                <?php
                if($arg3>0){
                ?>
                    
                    <a href="<?php echo SITE_URL; ?>/proizvodi/<?=$arg2;?>/<?=$prevArg3;?>/<?php if($arg4 != ""){echo $arg4;}?>" class="btn btn-sm btn-info pull-left">&laquo; Prethodna Strana</a>
                        
                <?php
                }
                ?>
                <?php
                if($arg3<$brStrana){
                ?>
                    <a href="<?php echo SITE_URL; ?>/proizvodi/<?=$arg2;?>/<?=$newArg3;?>/<?php if($arg4 != ""){echo $arg4;}?>" class="btn btn-sm btn-info pull-right">Sledeća Strana &raquo;</a>
                        
                <?php
                }
                ?>
            </div>
            <?php
            }
            ?>
        </div>
        <?php }
                ?>


I to bi bilo to za sada. U ovoj verziji ce ici ovako, u sledecoj ce se raditi na optimizaciji svega..
Daedalus Outsourcing | Web Development | SEO | Instagram Followers - http://daedalus.co.rs
 
Odgovor na temu

VladaSu

Član broj: 31634
Poruke: 1099
*.tippnet.co.rs.



+218 Profil

icon Re: Pretraga baze po vise OR i AND upita (problem)20.06.2018. u 20:03 - pre 70 meseci
Mogu samo da ti kazem da se ovako ne programira u PHP. Imas klikere za programiranje cim si napravio ovo sto si napravio ali imas pogresnu filozofiju programiranja.
Moglo bi se reci da razumes PHP naredbe i kako one rade i kombinujes ih na neki svoj nacin koji je praistorijski i neefikasan i van danasnjih standarda.
Napravio si kod za slucaj "Futrole" i onda ces za svaku kategoriju da kopiras ovaj kod ili sta? Sve ti je fiksirano za "futrole"
Ne smes da mesas PHP i HTML, ne u ovolikoj meri, to je osnovno. Moras da koristis OOP. Imam 1000 zamerki na ovaj kratak kod koji nija cak ni junior nivo vec neki pocetni skolski kod.
Bez uvrede. Zelim da te navedem da ispravniji put.
Mozda je bolje da uzmesi neki gotov shopping cart i samo ga podesi i doteraj vizuelno i naplati. Ostatak slobodnog vremena potrosi na ucenje nekog FW.
[Ovu poruku je menjao VladaSu dana 14.06.2003. u 11:22 GMT+1]
 
Odgovor na temu

Aleksandar Klickovic
Owner
Daedalus Outsourcing
Beograd

Član broj: 204183
Poruke: 344
*.dynamic.sbb.rs.

Sajt: petsq.me


+67 Profil

icon Re: Pretraga baze po vise OR i AND upita (problem)21.06.2018. u 12:17 - pre 70 meseci
Old school php, ovde doduse jeste malo isilovano, ali zbog dosta pokusaja i varijatni trazenja resenja..
Prvo naci da radi, pa posle optimizovati banana kod..

A frameworke sam zapostavio, istina, nekako drzim se ovog svog, em brzo radi, em je znacajno siguran.. Valjda od posla nije bilo vremena da se uce frameworci, a i oni se menjaju na dve tri god..

Ali hvala na savetu.
Daedalus Outsourcing | Web Development | SEO | Instagram Followers - http://daedalus.co.rs
 
Odgovor na temu

S A J A
Beograd

Član broj: 226539
Poruke: 1904
*.static.sbb.rs.



+421 Profil

icon Re: Pretraga baze po vise OR i AND upita (problem)22.06.2018. u 07:00 - pre 70 meseci
Ne trebaju ti ni frejmvorci ni OOP, samo odvoji front od beka. Ja uvek krećem od dva projekta, jedan je za front (HTML+CSS+JS) a drugi za bek (PHP i MySQL). Kominiciraju preko JSON-a. Tako ćeš imati i preglednost i brzinu i stvari će biti logički raspoređene. PHP zasija kad se koristi sam za sebe, bez mešanja sa HTML-om a na front strani, preko JavaScript-a možeš da napraviš nekoliko komponenti koje samo puniš podacima.
 
Odgovor na temu

VladaSu

Član broj: 31634
Poruke: 1099
*.tippnet.co.rs.



+218 Profil

icon Re: Pretraga baze po vise OR i AND upita (problem)22.06.2018. u 08:30 - pre 70 meseci
Veoma je lose savetovati da mu ne treba ni OOP ni framework. Sigurno postoji razlog zbog cega se niko ne moze nigde zaposliti bez znanja navedenog i cini mi se da mu niko drugi na forumu ne bi dao takav savet.
U danasnje vreme je neverovatno lose raditi PHP bez FW.
Tako mozes raditi privatno projekte ali te projekte niko nece nastaviti niti ce odrzavati. Svako bi zahtevao da se sajt pravi iz pocetka.
Ovaj kod koji je on napisao u fw moze da radi "skoro bez ijednog reda kodiranja" i to ispravno i bez bugova koje vidim da ima i sortirianje i promenu limita i dodatne filtere. Odmah da ima add new, edit i delete ako je ulogovan kao admin.
Ovo su rutinske stvari i pravi programer se ne fokusira na ovo vec na probleme.
Da je kojim slucajem ovo zapoceo u FW verovatno ne bi ni postavio pitanje na forumu.
Pravljenje nekog sajta u fw je najmanje 10 puta brze a toliko moze i da zaradi vise.
Znam jednu firmu koja ne radi u FW i veruj mi tamo ni jedan student koji iole nesto zna nece da se zaposli jer to je propast bez perspektive u najavi.
Ja sam ovako programirao jos dok nisu postojali FW i to je fizikalisanje i mucenje sa bugovima. O sigurnosti necu ni da pricam.
[Ovu poruku je menjao VladaSu dana 14.06.2003. u 11:22 GMT+1]
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.com
Via: [es] mailing liste

Sajt: mysql.rs


+2377 Profil

icon Re: Pretraga baze po vise OR i AND upita (problem)22.06.2018. u 10:16 - pre 70 meseci
aj to na php forumu ... php je izmisljen da bi se mesao sa html-om :) ..
aj zadrzimo ovde pricu na mysql-u a php ima svoje mesto
 
Odgovor na temu

VladaSu

Član broj: 31634
Poruke: 1099
*.tippnet.co.rs.



+218 Profil

icon Re: Pretraga baze po vise OR i AND upita (problem)22.06.2018. u 11:50 - pre 70 meseci
Hmmm, pravo da ti kazem nisam gledao koji je ovo podforum vec mi se komplet pitanje ucinilo da je cist PHP problem.
[Ovu poruku je menjao VladaSu dana 14.06.2003. u 11:22 GMT+1]
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.com
Via: [es] mailing liste

Sajt: mysql.rs


+2377 Profil

icon Re: Pretraga baze po vise OR i AND upita (problem)22.06.2018. u 15:37 - pre 70 meseci
ja se ujedam za jezik za te php izjave o oop i fw pa cisto lakse mi kad
mi ne stizu na mail :D a ne bi da ukinem da mi stizu na mail poruke sa
mysql foruma mozda neko bude pitao nesto pametno :D
 
Odgovor na temu

Aleksandar Klickovic
Owner
Daedalus Outsourcing
Beograd

Član broj: 204183
Poruke: 344
*.dynamic.sbb.rs.

Sajt: petsq.me


+67 Profil

icon Re: Pretraga baze po vise OR i AND upita (problem)21.08.2018. u 11:24 - pre 68 meseci
Mali update. Isforsirao sam produzenje roka, unajmljena je osoba da poveze sve artikle sa novim kategorijama i podkategorijama i lagano odradjen prikaz po tim kriterijumima.
Ali eto, svakako neke nove stvari naučene, makar i kako ne treba raditi :)
Daedalus Outsourcing | Web Development | SEO | Instagram Followers - http://daedalus.co.rs
 
Odgovor na temu

[es] :: MySQL :: Pretraga baze po vise OR i AND upita (problem)

Strane: 1 2

[ Pregleda: 6328 | Odgovora: 36 ] > FB > Twit

Postavi temu Odgovori

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