Žodžiu taip. Krapštinėju čia vieną tokią apmokėjimo sistemą (būna gi kartais tokių užsakovų norų – iš gero daikto padarykit fufelį), tai tarp debesies užklausų kurias pagimdžiau viena buvo tokia nenormali (sudėta į perl kintamąjį):
$disk_usage = "SELECT (SELECT res.value*res.multiplier AS diskspace FROM ve ve LEFT JOIN resource AS r ON ve.platform_id = r.platform_id LEFT JOIN subscr_ve AS suve ON ve.ve_id = suve.ve_id LEFT JOIN subscr_orders AS sord ON suve.subscr_id = sord.subscr_id LEFT JOIN order_res AS res ON sord.ar_doc_id = res.ar_doc_id AND r.res_id = res.res_id WHERE ( suve.ve_id IS NOT NULL AND sord.subscr_id IS NOT NULL AND res.ar_doc_id IS NOT NULL AND ve.ve_id=(SELECT ve_id FROM subscr_ve WHERE subscr_id='$sid' AND ve_id IS NOT NULL) AND r.short_name IN ('diskspace')) ORDER BY sord.start_date LIMIT 1) as space, (SELECT MAX(diskusage) AS diskusage FROM ve_quota_stat_history WHERE ve_id=(SELECT ve_id FROM subscr_ve WHERE subscr_id='$sid' AND ve_id IS NOT NULL) AND interval_type=0 AND time_stamp BETWEEN '$times[0]' AND '$times[1]' ORDER BY diskusage DESC LIMIT 1) as used;";
Kad dar nors kalba eitų apie MySQL 5.x – tada būtų galima labai supaprastinti reikalą. Betgi dabar turiu bėdą su 4.1, kurios negalima upgradinti ar keisti. Sutinku, kad užklausa neoptimali (ir turint laiko netgi žinau ką reiktų pakeisti), bet užtat veikia! =)
Iš vienos pusės – kapanotis po nedokumentuotus sistemos vidurius kaip ir neturėtų smarkiai vežti, iš kitos – užsivedžiau, ir galutiniame rezultate gavosi 2K eilučių monstras, kuris panašu kad jau daro tai ką reikia.
Sekant skaitytom frazėm:
- Kiekviena programa turi bent vieną bugą
- Kiekvieną programą galima sumažinti bent viena eilute
Padarom išvadą, kad kiekvieną programą galima sumažinti iki vienos eilutės, kurioje būtinai bus bugas…
Paskaičius tokių filosofijų bei parašinėjus tokias užklausas man nebereiks ir rūkyt (ko ir taip nedarau jau gerą laiką) – nuo skriptavojimo užsivesiu. Laiku tik į klubą kokį nulėkt! ;-)