[ vatri @ 21.10.2009. 13:41 ] @
Poz.

Imam jedan niz (koji sam napunio iz mysql baze) i 10ak tabela u kojima je PO oko 3.000 do 10.000 rekorda (ukupno recimo 50.000)
Potrebno mi je da prodjem sa while petljom kroz sve te tabele i da provjerim sve rekorde (za 1 kolonu). Ako se to polje nalazi u gore pomenutom nizu, potrebno je izvrsiti UPDATE tog reda.
I to tako sto ce ga zamjenit za vrijednost iz ovog niza (kljuc je to polje iz tog reda).

E sad sam uspio izpisat sve te query-je u HTML, ali kad stavim da se izvrsavaju to traje vjecnost (tacnije pustio sam 15-ak min da radi ali nije zavrsio). Probao sam sa mysql_free_result() ali isto (vidjecete dole na kraju kod-a je zakomentirano)


Postavicu ovde kod, pa bi molio za bilo kakvu pomoc?


napomena:
imamo 2 niza $old_kemids_rev i $old_kemids (isti su samo je uradjen array_flip() )

Code:


$pr = mysql_query("SHOW TABLES from baza LIKE '30a_%'") or die(mysql_error());
while($iz = mysql_fetch_array($pr)){
    $tbl = $iz[0];

    $suff = str_replace('30a','',$tbl);

    if($tbl != '30a_sest'){

//--------------------------------------------------------------------------------------------------------
        // prikazemo kolone
        $pr1 = mysql_query("show columns from $tbl");
        // uzmemo drugu kolonu (prva je kljuc)
        $col_name = mysql_result($pr1,1);
        // provjerimo jel $col_name kljuc, ako jeste uzmemo neku drugu
        if($col_name == 'kemid'){
            $col_name = mysql_result($pr1,0);
        }
        // uzmem red koji ispitujemo (koje treba update-ovat)
        $pr2 = mysql_query("select kemid FROM $tbl");
        while($iz2 = mysql_fetch_array($pr2)){
            $kemid = $iz2[0];
            // provjerimo da li postoji u nizu to polje:
            if(@in_array($kemid,$old_kemids) ){
                // uzimamo vrijednost za to polje: 
                $ekvivalent = $old_kemids_rev[$kemid];
                // uzmemo vrijednost gore pomenute kolone za taj red
                $pr3 = mysql_query("SELECT $col_name from 30$suff where kemid = $kemid");
                $iz3 = mysql_fetch_array($pr3);
                $value_from_30 = $iz3[0];
                // zamjenimo sa vrijednosti iz niza:
                if($value_from_30){
                    $q = "UPDATE $tbl SET kemid = '".$ekvivalent."'
                        WHERE kemid = '$kemid'
                        AND $col_name = \"$value_from_30\"";
                }
            //    echo "<p>$q</p>";
                mysql_query($q) or die('Greska u '.$tbl.':  '.mysql_error());
            //    mysql_free_result($pr3);
            }
        }
//-----------------------------------------------------------------------------------------------------------

    }
}
/* End of replacing 'kemids' */



[Ovu poruku je menjao vatri dana 22.10.2009. u 09:48 GMT+1]
[ dakipro @ 21.10.2009. 13:54 ] @
Bez puno gledanja u kod, samo da pitam da li mozda mozes nekako vrtiti taj niz, i samo raditi update sa predefinisanim where delom koji ti odgovara po nizu?
Znaci izvrtis sta trebas da izmenjas iz niza, i samo pustat update, izbacis ovaj select, mozda bi to ubrzalo sve ovo, naravno, ako ti logika to omogucava, kazem, nisam previse gledao kod, samo pristup
[ vatri @ 22.10.2009. 11:44 ] @
evo pustio sam malo da prenoci ne bi li se sjetio neceg ali nista pametno.

daki nisam najbolje razumio pitanje, ali ako si mislio to sto ja mislim da si mislio, onda ne moze. :)

Stvar je ovakva

-baza:

30a_osnovna (kemid, old_kemid,..., i_jos_neka_nebitna_polja)
---------------------------------------
29_prva (kemid, ..., jos_neka_nebitna_polja) < br. kolona nije preciziran

29_druga (kemid, ...., jos_nesto...) < br. kolona nije preciziran
---------------------------------------
30_prva ... < ista struktura ko 29_prva samo vrijednost polja i broj redova je moguce razlicito

30_druga < isti slucaj
----------------------------------------
...
..
ima_jos_tabela


znaci imam 2 verzije baze, odnostno tabele sa prefiksom 29_ i 30_ . 29 je stara 30 je nova. te 2 verzije moram zdruziti na sledeci nacin:

- u 30 verziji su bili dodani rekordi i pored toga postoje neki iz 29 koji su promjenjeni
- trebam dobiti novu veziju (30a_) koji sadrze ove 2 verzije zdruzene.
- imam tabelu 30a_osnovna gdje se nalaze kemid i old_kemid:
--- old_kemid je onaj kemid iz 30ke cije su se ostale kolone (njene vrednosti) nalazile u 29 ali su bili promjenjeni (zajedno sa kemid-om)


skripta:

--- skriptu sam napravio koja uradi sledece:

|------ kopira sve tabele iz 29_ u 30a_.
|------ izbrise one koje imaju vrednost kemid u 30a_osnovna (znaci da ima ekvivalenta iz 30ke)
|------ kopira sve iz 30ke

e sledeci korak je samo da te sto sam zadnje kopirao UPDATE-ujem tako da im zamjenim kemid sa ekvivalentom iz 30a_osnovna
/////////////////////////////////////////////

Kao sto sam rekao uspio sam napisati skriptu koja unutar while petlje ima variablu $q koja sadrzi query koji treba izvrsit.

Sad sam stavio samo echo "<p>$q</p>" i to mi fino ispise u HTML sve kverije koji trebaju da budu izvseni. (to se izvrsi za 30-40 sekundi)
Ali kad stavim mysql_query($q) or die(mysql_error()) - kompjuter radi ali nikako da zavrsi (pustio sam ga 20 min) :s

Da li da ostavim racunar jos duze da radi ili mozda da probam tu variablu popunit u while petlji da izgleda ovako nesto:

UPDATE 30a_prva SET kemid = '3727' WHERE kemid = '859' AND druga_kolona = "620" ;
UPDATE 30a_prva SET kemid = '3728' WHERE kemid = '869' AND druga_kolona = "623" ;
... itd

i na kraju stavim mysql_query($q);

Da li moze tako da se izvrsi query u mysql_query() funkciji?
[ Nemke_BG @ 23.10.2009. 08:51 ] @
tako nesto ne moze u mysql_query() da prodje, za to bi trebao da koristis mysqli_multi_query() f-ju ili da to posaljes kao transakciju(ako koristis MyIsam izbegavaj, a ako koristis InnoDB onda slobodno ), to bi trebalo da ti dosta smanji duzinu izrsavanja skripte....
[ w3bl0rd @ 23.10.2009. 09:07 ] @
ne znam sad koliko redova imaš u bazi no mmožda bi ti bilo brže da selektiraš van sve iz cijele tabele pa onda u php-u da filtriraš što ćeš prikazat a što ne...
[ vatri @ 23.10.2009. 10:40 ] @
evo uspio sam nekako, tj. komp je uspio :))

uradio sam ovo: $mysqli->multi_query($q); i pustio ga tacno 1655 sekundi....

Hvala svima na trudu...