krenpac

Statistika

Pridružen/a:
12 jul 2017, 08:07
Zadnjič aktiven:
Prispevki:
Teme:
3 | Vse teme
4
0
0
#5

Vini:

Aha, ne, štekam zdaj, potrebuješ recorde po posameznih datumih, potem tale moja rešitev ne bo v redu.



Subquery bi bil rešitev, ne vem zakaj se ga otepaš. Moraš pa seveda poskrbeti za pravilno indeksiranje.




Se opravičujem, sem se zmotil pri razvrčanju. Najprej se razvrsti po ceni, šele nato po datumu.

Bom poskusil vse še enkrat opisati, ker sem včeraj pisal pozno, pa mogoče ni bilo vse skupaj najbolj jasno.

Torej za osnovo imam tabelo, ki je prikazana v 1. sporočilu, da ne bo dvoma, jo kopiram še enkrat.



id cena kolicina datum

1 100 0.01 2017-11-19 23:07:19

2 70 0.4 2017-11-19 15:07:19

3 25 6 2017-11-19 01:07:19

4 98 0.1 20 2017-11-19 23:07:19



Želim ustvaril poizvedbo, ki bi po datumu in ceni razvrčenem seznamu (ORDER BY cena DESC, datum ASC) ob od uporabnika določenem pogoju o max. skupni zahtevani količini* (WHERE -?-), vrnila seznam ustreznih vrstic.

*vsota količin se sešteva tako kot sem zapisal v prvem sporočilu, torej, če uporabnik zapiše za max. skupno zahtevano količin 0.3 potem bi želel, da mysql od 1. vrstice naprej preverja ta pogoj (sešteva podane količine in vkolikor je skupna vsota večja od 0.3, vse naslednje vrstice ne bodo ustrezne). Sicer pa tako vidim, da si Vini vse razumel.



Rešitev, ki deluje, a me skrbi, da ni optimalna, je ta...


SELECT
*,
(SELECT
sum(cena) FROM tabela
WHERE id <= t.id) 'skupaj'
FROM tabela t
HAVING skupaj < 2

Zgornje rešitve nisem implementiral, trenutno imam urejeno tako, da najprej izvedem query brez pogoja o količini, le ob pogoju o ceni (ja, tudi cena je pogoj, a ceno in hkrati količino v isti poizvedbi ne morem (?) uporabiti, ker je trik, namreč, če je skupna vsota količin več kot od uporabnika določena vrednost, se del količine lahko tudi odvzame naslednje, sicer po merilih poizvedbe neustrezne vrstice... omb, upam, da bo kdo razumel, kaj želim povedati :) ne znam drugače razložiti, v glavnem, to poizvedbo "o tej famozni vsoti količin" bi potem uporabil izključno, da bi dobil število ustreznih vrsti + 1(!), in to vrednost bi potem uporabil kot max. LIMIT pri spodnji poizvedbi)


SELECT * FROM tabela WHERE cena >= od_uporabnika_dobljena_vrednost  ORDER BY cena DESC, datum ASC.

Trenutno, po izvedbi zgornje poizvedbe ("ki je še brez LIMIT"). filtriram ustrezne vrstice iz polja zadetkov (recimo "narocila"), s PHP zanko. Ko so pogoji izpolnjeni, se zanka ustavi (break),



Pri tem načinu me skrbi to, da je polje "naročila", ki ga dobim iz poizvedbe, lahko zelo veliko, ker v poizvedbi pač nisem upošteval parametra o največji dovoljeni vsoti količin. Recimo, če uporabnik za ceno vpiše 0, potem bodo ustrezni čisto vsi zapisi v bazi, pa čeprav bi bila količina recimo le 0.1 in bi dejansko bil ustrezen le 1. zapis. Torej trenutno imam na pladnju 2 rešitvi, prva je ta s potecialno zelo velikim poljem (RAM) ali gnezdeno poizvedbo, ki bi pa potencialno lahko izvedla ogromno podquerijev, če bi na primer bile ustrezne količine v bazi majhne (recimo 0.00001), od uporabnika določena količina pa bi bila npr., ne vem, 100, potem bi bilo teh delnih vsot (in s tem podquerijev), predno bi se vse skupaj zaključilo ogromno.



Sicer bom tako vse potestiral, ko pride to na vrsto (s par milijoni dummy zapisov & explain) ampak me vseeno zanima, če se da ta delna vsota količin nekako elegantneje rešiti, ker ta rešitev mislim, da ni optimalna, ali pa mogoče, da se da vse zapisati celo z enim querijem (+1 dodatni "neustrezni" vnos).


všeč(4) ni všeč(0) spam(0)
#

Imam na primer spodnjo tabelo



id cena kolicina datum

1 100 0.01 2017-11-19 23:07:19

2 70 0.4 2017-11-19 15:07:19

3 25 6 2017-11-19 01:07:19

4 98 0.1 20 2017-11-19 23:07:19



Želel bi izpisati vnose katerih skupna količina je recimo manjša od neke vrednosti. Vnosi so recimo razvrščeni po datumu in ceni.



Torej...


SELECT * FROM tabela ORDER BY datum DESC cena ASC

izpiše

id cena kolicina datum

1 98 0.1 20 2017-11-19 23:07:19

2 100 0.01 2017-11-19 23:07:19

3 70 0.4 2017-11-19 15:07:19

4 25 6 2017-11-19 01:07:19



In sedaj bi rad iz te tabele dobil podatke kjer je skupna količina manjša od recimo 0.3, torej da bi se v tem primeru izpisalo...

1 98 0.1 20 2017-11-19 23:07:19

2 100 0.01 2017-11-19 23:07:19

(ker je 0.1+0.01 < 0.3, 3. vrstica pa že več ne ustreza pogoju, ker 0.1+0.01+0.4 ni manj kot 0.3)



Ima kdo idejo, kako bi to naredil? Pa če se da brez gnezdenih poizvedb (to rešitev že imam in jo ne mislim uporabiti, ker je potencialno zelo potratna)


všeč(0) ni všeč(0) spam(0)
#3

Mi je uspelo rešiti na bolj quick&dirty način. Če koga zanima, lahko objavim mojo rešitev.


všeč(0) ni všeč(0) spam(0)
#2

S tem žal ustavim celotno validacijo, kar pa ne želim. Torej, če imam polje uporabniško ime, email in geslo ter imam pri email zapisano 'cancelOnFail' => true, se validacija za geslo ne bo izvedla (če recimo polje email pustim prazno).


všeč(0) ni všeč(0) spam(0)
#

Mogoče kdo ve, kako bi pri validaciji obrazca za posamezni tag izpisal le eno opozorilo in ne vseh, v kolikor se pojavi napaka. Torej na primer za email polje definiram, da ne sme biti prazno, ter da je email pravilnega zapisa.



Če bi uporabil Forms, bi zapisal nekaj takšnega...


class RegisterForm extends Form {
$email = new Text('email');
$email->addValidators(array(
new PresenceOf(array(
'message' => 'Vpiši email'
)),
new Email(array(
'message' => 'Email ni pravilnega zapisa'
))
));
$this->add($email);
}

Če validator, pa tole...


class RegisterValidation extends Validation {
$this->add ( 'email', new PresenceOf ( [
'message' => 'Vpiši email'
] ) );

$this->add ( 'email', new Email ( [
'message' => 'Email ni pravilnega zapisa'
] ) );
}

Pri validaciji pa mi v primeru, da pustim email polje prazno, seveda izpiše oba opozorila, kar se mi zdi odveč. Naj izpiše samo eno, na primer najprej prvo. Torej, da "Vpiši email", če je email vpisan, a nepravilnega zapisa, pa naj potem izpiše še drugo opozorilo. Ve kdo, kako bi to izvedel? Sem googlal ampak brez uspeha... Phalcon žal nima tako velike skuponosti kot kakšen Laravel :(


všeč(0) ni všeč(0) spam(0)
#5

SlimDeluxe:

Enkrat imaš \Mainsite\ enkrat pa \MainSite\, najprej to popravi.




Tu je bila napaka, tako da res najlepša hvala! Sam jo ne bi nikoli odkril, ker sem bil enostavno slep na veliko/malo pisavo, sem večkrat preveril in meni se je zdelo enako :P


všeč(0) ni všeč(0) spam(0)
#2

Lokalno 7.0.1, na strežniku sem poskusil 7.0, zdaj imam pa 7.1. Ne na eni ne na drugi verzi mi ne deluje.


všeč(0) ni všeč(0) spam(0)
#

Naletel sem na problem s katerim sem ukvarjame že lepo število ur in ga enostavno ne uspem rešiti.



Sem že spraševal na slo-tech.com (https://slo-tech.com/forum/t703704/p5583566#p5583566 oz. https://slo-tech.com/forum/t703704/p5583566) pa žal zanekrat še brez uspeha.



Torej trenutno se ubadam s tem, zakaj ne deluje spodnje.



Ustvaril sem 3 instance, vse skupaj delujejo, če kličem samo 3. pa ne deluje in mi PHP javi napako. Se mogoče komu sanja v čem je težave, ker meni se niti približno ne?




  1. primer





Vse ok, v logu ni poročila o napakah.




  1. primer (le zakomentiral sem prvi 2 instanci, ostalo je 100% enako in sedaj, kar naenkrat, 3. instance PHP več ne najde in mi izpiše napako)





Napaka iz loga...



[Wed Jul 12 09:38:48.062545 2017] [fcgid:warn] [pid .:tid .] [client .] mod_fcgid: stderr: PHP Fatal error: Uncaught Error: Class 'Controllers\MainSite\HomeController' not found in /home/./domains/..com/init/boostrap.php:244



Naj še omenim, da mi na localhost deluje vse brez težav, na strežniku, kjer stran gostim, pa enostavno ne. Pa sem spremenil že malo morje stvari. Se komu kaj več sanja kot se meni?


všeč(0) ni všeč(0) spam(0)