Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  ZEND: MySQL päringu optimiseerimine märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
kpihus
Kreisi kasutaja
kpihus

liitunud: 14.04.2003




sõnum 03.01.2012 16:27:22 ZEND: MySQL päringu optimiseerimine vasta tsitaadiga

On lahendus, kus (lihtsustatult) on kaks andmebaasi tabelit. Ühes on tellimused (toote kood, kogus, klient, jne), ning teises on tooted (toote kood, toote nimi, toote hind, jne)
Mõlema tabeli jaoks on tehtud mudel/klass, mis laiandab Zend_Db_Table_Abstract klassi.

Kui kliendi tellimust välja kuvan, pärin tellimuste tabelist kõik tellimused
tellimused->fetchAll()
, hakkan saadud massiivi foreaciga läbi kammima, ning iga toote juures pärin koodi järgi toodete tabelist toote nime ja hinna. Saadud infotst panen kokku uue kahemõõtlemise masiivi, mille lõpuks kuvan vaates kasutajale.

Ilmselgelt ei ole see lahendus kõige optimaalsem ja kiirem, kuna päringuid tehakse palju. Naturaalsete mysql päringutega saaks kõik info korraga kätte ühte massiivi.

Küsimus on seega, kuidas teha Zendis mudel, mis ei oleks ühe tabeli septsiifiline, vaid mis oskaks n+1 tabelist korraga päringut teha.

Kui seletada ei viitsi, oleks ka asjakohane google link abiks.
Kommentaarid: 26 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 25
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
EagerFish
HV vaatleja
EagerFish

liitunud: 08.11.2011




sõnum 03.01.2012 22:14:19 vasta tsitaadiga

Lahendus oleks kasutada LEFT JOIN'i näiteks.
Zendiga saab asja umbes nii lahendada - kopeerisin siia ühe enda nuditud näite.
See konkreetne näide siis tõmbab ads igale kirjele juurde ka kasutaja väljad (välju siin täpsustatud pole seega tulevad kõik).


$ads =   new Application_Model_DbTable_Ads();
$users = new Application_Model_DbTable_Users();

$select = $ads->select()->setIntegrityCheck(false);

$select->from(array('a' => $ads->info('name')))
->joinLeft(array('u' => $users->info('name')), 'a.user_id = u.id')
->where('a.user_id', KASUTAJA_ID);

$items = $ads->fetchAll($select)->toArray();


Põhimõtteliselt peaksid siis endal arvatavasti võtma tabelist tellimused kirjed ja LEFT JOIN'ima toodete tabelist vajalik lisainfo. Minul etendab seda "lisainfo" osa siin näites "users" tabel.

_________________
give.ee - klientidele, kes hindavad disaini
tagasi üles
vaata kasutaja infot saada privaatsõnum
kpihus
Kreisi kasutaja
kpihus

liitunud: 14.04.2003




sõnum 04.01.2012 00:48:21 vasta tsitaadiga

EagerFish kirjutas:
Lahendus oleks kasutada LEFT JOIN'i näiteks.
Zendiga saab asja umbes nii lahendada - kopeerisin siia ühe enda nuditud näite.
See konkreetne näide siis tõmbab ads igale kirjele juurde ka kasutaja väljad (välju siin täpsustatud pole seega tulevad kõik).


$ads =   new Application_Model_DbTable_Ads();
$users = new Application_Model_DbTable_Users();

$select = $ads->select()->setIntegrityCheck(false);

$select->from(array('a' => $ads->info('name')))
->joinLeft(array('u' => $users->info('name')), 'a.user_id = u.id')
->where('a.user_id', KASUTAJA_ID);

$items = $ads->fetchAll($select)->toArray();


Põhimõtteliselt peaksid siis endal arvatavasti võtma tabelist tellimused kirjed ja LEFT JOIN'ima toodete tabelist vajalik lisainfo. Minul etendab seda "lisainfo" osa siin näites "users" tabel.


Mhmm, selle peale ma ei tulnudgi, et kahe mudeli vahel joini teha. Ma eeldan et selliselt toimub joinimine ikka DB poolel, ning PHP'st läheb baasi ainult üks päring ?
Kommentaarid: 26 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 25
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
EagerFish
HV vaatleja
EagerFish

liitunud: 08.11.2011




sõnum 04.01.2012 00:56:50 vasta tsitaadiga

Nii ta on.

Muide, kui teed castimise (string) select objektile siis näed pärigut mis konstrueeritakse.

Lisa lõppu ja näed mis päring reaalselt läheb baasi.
echo (string)$select;

_________________
give.ee - klientidele, kes hindavad disaini
tagasi üles
vaata kasutaja infot saada privaatsõnum
kpihus
Kreisi kasutaja
kpihus

liitunud: 14.04.2003




sõnum 15.03.2012 14:33:47 vasta tsitaadiga

Üldiselt joinimene kõik käib nagu kella värk, aga ühe triki päringuga on veidi raskusi:

        $select->from(array('a' => $this->info('name')))
                ->joinLeft(array('u' => $productsDb->info('name')), 'a.systemid = u.systemid')
                ->joinLeft(array('s'=> $storeDb->info('name')), "u.code = s.product and s.company='$companyid'")
                ->where("a.companyid='$companyid'");


Ehk siis loogika selline
$this baasist loeme kogu sodi
products baasist (u) loeme juurde vajalikud asjad sealt kus this ja producti systemid'd klapivad
Lisaks võtame juurde asjad store baasist (s) juhul kui produkti kood on sama, mis stores olev kood, ning lisaks, kui stores olev company vastab funktsioonile kaasa antud company id'ga
Aga Zend vastab: Column not found: 1054 Unknown column 's.product'

kuigi s tabelis on päris kindlasti product column olemas.

Kus ma võssa sõitnud olen ?
Kommentaarid: 26 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 25
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
DoS
HV veteran
DoS

liitunud: 19.08.2002




sõnum 15.03.2012 19:39:59 vasta tsitaadiga

http://framework.zend.com/manual/en/zend.db.profiler.html

Zendist ei ole aimugi, aga mina vaataks esimese asjana genereeritud SQL lauset.

Ja nüüd märkasin, et midagi sellist oli 2 posti üleval ka juba pakutud.
Kommentaarid: 50 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 47
tagasi üles
vaata kasutaja infot saada privaatsõnum
kpihus
Kreisi kasutaja
kpihus

liitunud: 14.04.2003




sõnum 16.03.2012 09:47:40 vasta tsitaadiga

Tainas olen, mis muud.

Storedb objekti loomisel kasutasin täiesti valet DBTable mudelit. Ning seal tabelis loomulikult ei olnud product columni.

Debugimisel loomulikult keskendusin ainult sql päringule.
Kommentaarid: 26 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 25
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  ZEND: MySQL päringu optimiseerimine
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.