Autor Zpráva
laikathecosmonaut
Profil *
Dobrý deň,

potreboval by som poradiť ako na jeden štatistický dotaz, dosť som sa stratil, nevráti mi žiadny výsledok ako by som potreboval..

Mám tabuľku userAccess, ktorá má relatívne jasnú štruktúru a určuje odkedy dokedy má človek prístup:
accessId | userId | dateFrom | dateTo | status | admin| created|
1             |    1      |2012-11-01|2012-11-30| 1| 1 | 2012-10-10
2             |    5      |2012-05-17|2012-11-30| 1| 1 | 2012-05-10
3             |    11      |2012-01-22|2012-12-30| 1| 1 | 2012-01-10

V tabuľke je samozrejme neporovnateľne viac záznamov (cca. 1200), a potreboval by som zistiť koľko ľudí malo prístup napr. v 11 mesiaci (je jedno či celý mesiac alebo len časť, proste počas toho mesiacu).

Samozrejme obyčajná klausala WHRE dateFrom >= 2012-11-01 and dateTo <=2012-11-30 nie je vôbec použiteľná, skúšal som teda between vo forme WHERE (`dateFrom` BETWEEN '2011-11-01' AND '2011-11-30') and (`dateTo` BETWEEN '2011-11-01' AND '2011-11-30') ale neviem.. nevrati to žiadny výsledok, takže predpokladám že je to zle.. Samozrejme, predpokladám že tie dátumy sa budú doplnovať z formulára.

Nejaký nápad ako to vyriešiť? Ten môj dotaz je úplne mimo? :)

Ďakujem za pomoc.
juriad
Profil
chceš uvažovat opačně:
dateFrom <= 2012-11-30 AND dateTo >= 2012-11-01
rozmysli si, proč to funguje
laikathecosmonaut
Profil *
Možno to je tým že premýšlam príliš zložito, ale každopádne.. V mojom prípade sú tie intervaly uzatvorené a to znamena že v prvom riadku ukážky by to funguvalo, v druhom ale už nie pretože sa to nerovná. Okrem toho samozrejme nie je ani menší.

Hm v tom vašom prípade to je iné, síce to nevráti to čo by som očakával ale je to posun vpred, ďakujem už len zistiť či sú chybné moje očakávania alebo niečo iné. :)
Joker
Profil
laikathecosmonaut:
Hm v tom vašom prípade to je iné, síce to nevráti to čo by som očakával ale je to posun vpred, ďakujem už len zistiť či sú chybné moje očakávania alebo niečo iné. :)
Asi by to nefungovalo správně v případě, kdy by existovaly záznamy s neomezenou platností, které by dateTo neměly vyplněné.

Ale kdyžtak zkuste najít záznam pro který to nefunguje správně a budeme vědět víc.
Kajman
Profil
A datumy si dejte do uvozovek, aby se ta čísla neodčítala
dateFrom <= '2012-11-30' AND dateTo >= '2012-11-01'
laikathecosmonaut
Profil *
ďakujem páni, uvedený dotaz je samozrejme správne. Chyba bola ako vždy medzi klávesnicou a stoličkou, dobehol ma môj zvyk dvojslovené premenné a názvy stĺpcov písať formou dateTo.. v dotaze som mal chybný názov stĺpca dateFrom <= '2012-11-30' AND dateto >= '2012-11-01'.

Nerozumiem prečo vôbec niečo vrátil, nemal náhodou hlásiť neexistujúci stĺpec?
Kajman
Profil
U názvů sloupců se velikost písmen nerozlišuje. Chyba byla asi v něčem jiném.

Edit: nebo tam byla kolize s aliasem ze select části?
laikathecosmonaut
Profil *
Neviem, vy asi máte viacej skúseností.. Pri testoch cez skript sa to tvárilo relatívne normálne. Nehodilo chybu, ale nehodilo ani správny výsledok, používam databázový layer od známeho, ktorý by v prípade chyby v dotaze vypísal čo sa mu presne nepáči, vačšinou teda pomocou debugovacej funkcie.

Ale tá vrátila len info v štýle, pripojenie k databáze bolo úspešne, spojenie s tabulkou bolo úspešne, dotaz prebehol v poriadku za xx ms, vysledok je 0.

Až keď som dotaz spúšťal cez phpmyadmina tak som si všimol že ak som použil dateTo, tak mi vo výsledku stĺpec dateto nezvýraznil (ako keby vôbec nebol v podmienke) ale keď som dal dateTo tak ho zafarbil. Po zmenení v MySQL tabuľke začalo niečo vyberať.

Keďže som sa tomu už včera nemohol venovať, pokračoval som až dnes. A prešiel som si to, že to asi nejde. S tejto spomínanej tabuľky by mal hodiť napr. v mesiaci november (tj. od 1.11.2012 do 30.11.2012) boli aktívny 2 ale nevráti nič.

Keďže by som takto chcel zistiť info za celý tento rok hodil som si to do cyklu, aby som mohol posúdiť či to teda ide alebo nie, predsa ak vyhodnocujem viac dát som si trochu istejší.. Obecne si myslim že to nejde, niekde to niečo vráti ale sú to dosť nezmysli. Ten cyklus vyzerá takto:
    //pomocne premenne, aktualny mesiac, aktualny rok
    $month = date("m");
    $year = date("Y");     
    //cyklus ktory prebehne vsetko az k januaru                
    for($i=0; $i<$month; $month--)     
    { 
         //zisti prvy den v mesiaci vrati Y-m-d
         $start_date = $create->firstDay($month, $year);
         //zisti posledny den v mesiaci vrati Y-m-d
         $end_date = $create->lastDay($month, $year);
         //zisti slovensky nazov mesiaca, do vypisu
         $mesiac = $create->getMesiac($month).", ".$year;              
         $active = $sql->nums("select * from userAccess where status = '1' and (dateFrom <= '$start_date' AND dateTo >= '$end_date')");                 
    }  

Status som predtým v mojom príklade nepoužil, pretože nie je podstatný a doplnil som ho len teraz. Nevyberie to ani bez neho.. ale obecne užívateľ získava prístup až keď je status 1 preto tam vo finále je.

Nie som príliš dobrý na sql, tak neviem asi som si vybral príliš veľké sústo.
Kajman
Profil
Máte v dotaze přehozené $start_date a $end_date.
laikathecosmonaut
Profil *
tak to ja asi radšej idem na kávu, taká banalita :)

Ďakujem.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0