praegune kellaaeg 20.06.2025 00:34:22
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
kpihus
Kreisi kasutaja

liitunud: 14.04.2003
|
03.01.2012 16:27:22
ZEND: MySQL päringu optimiseerimine |
|
|
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
, 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 |
|
 |
EagerFish
HV vaatleja

liitunud: 08.11.2011
|
03.01.2012 22:14:19
|
|
|
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 |
|
 |
kpihus
Kreisi kasutaja

liitunud: 14.04.2003
|
04.01.2012 00:48:21
|
|
|
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 |
|
 |
EagerFish
HV vaatleja

liitunud: 08.11.2011
|
04.01.2012 00:56:50
|
|
|
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.
_________________ give.ee - klientidele, kes hindavad disaini |
|
tagasi üles |
|
 |
kpihus
Kreisi kasutaja

liitunud: 14.04.2003
|
15.03.2012 14:33:47
|
|
|
Ü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 |
|
 |
DoS
HV veteran

liitunud: 19.08.2002
|
|
Kommentaarid: 50 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
47 |
|
tagasi üles |
|
 |
kpihus
Kreisi kasutaja

liitunud: 14.04.2003
|
16.03.2012 09:47:40
|
|
|
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 |
|
 |
|
lisa lemmikuks |
|
|
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.
|