Autor Zpráva
FantomX1
Profil
Ako možem vytvoriť dotaz na vybratie času kedy bolo prihlásených najviac ľudí online súčasne. Tak ako to napríklad býva na mnohých fórach. Ja by som to chcel použiť na chate.

Dá sa to spraviť keď mám v databáze v tabuľke 2 stĺpce, jeden prihlásenie, druhý odhlásenie?
A oba sú typu INT zaznamenávajú UNIX TIMESTAMP ako počet sekúnd od roku 1.1.1970.

Zaznamenávam si takto všetky prístupy na chat, len by som vedel ako napríklad dostanem sekundy, kedy bolo prihlásených najviac ľudí online. Proste vycucnúť odtiaľ nejak ten čas správnym SQL dotazom.

Sformátovať si čas na správny formát si už dokážem.

Ďakujem všetkým fachmanom, analytikom a fanatikom do SQL za rady.

-------------
FANTOMX1
Kajman_
Profil *
Pro poslední den, nebo celkově?

Ono to totiž asi moc dobře nepůjde a asi bude třeba spočítat každou minutu jiný součet a z něho to maximum udělat.
FantomX1
Profil
Ano, celkovo. Viem, že to nebude asi najjednoduchšie, ale mýslím si, že by to nejak malo isť.
Kajman_
Profil *
Myslím, že počítat to nad všemy daty v reálném čase je nesmyl. Asi bych si nachystal tabulku s jendotlivými minutami a tu nějak postupně plnil těmi součty.
vrbcik
Profil
Prozmýšľam nad tým. Podľa mňa však servre nevyberajú: "okamih, v ktorom bolo prihlásených najviac ľudí" ale dajme tomu podľa hodiny dňa zgrupujú prihlaseny_od a prihlaseny_do:

konverziu dátumu na hodinu píšem v Oracle syntax, je mi to bližšie:
to_char (datum_prihlasenia , 'HH24')




SELECT hodiny_dna.hodina, COUNT(*)
FROM pristupy
JOIN (SELECT AS 0 hodina UNION ALL SELECT 1 AS hodina .... UNION ALL SELECT 23 AS hodina) hodiny_dna
ON (hodiny_dna.hodina BETWEEN to_char (pristupy.datum_prihlasenia , 'HH24') AND to_char (pristupy.datum_odhlasenia , 'HH24')
)
GROUP BY hodiny_dna.hodina


Samozrejme, podobný dotaz dá sa urobiť aj po sekundách, ale tá záťaž... Ešte porozmýšľam nad lepším riešením.
kaifman
Profil
tabulka posledniPristup(
uzivatel int,
cas datetime)

pri kazdem obnoveni updatnes tuto tabulku pro toho uzivatele

a zaroven se do ni podivas

select count(*) from posledniPristup where cas between date_sub(now(), interval 15 minute) and now()

nekde v souboru nebo v db budes mit ulozen maximalni pocet a datum s casem coz porovnas s vysledkem a pokud to bude vic tak to si to ulozis
vrbcik
Profil
Ahoj, tak malé vylepšenie, ktoré nájde presný okamih (sekunda) a počet prihlásených užívateľov.
Je vhodné po určitom čase (napr. 31.12.2005) hodnoty uložiť a zapamätať si túto hodnotu. Ďalšie selecty budú vyberať iba počty prihláseni po 31.12.2005:


SELECT intervaly.spodna_hranica, count(*) pocet
FROM pristupy
--tu môže byť WHERE datum_odhlasenia >= '31.12.2005'
JOIN
(
SELECT pristupy.datum_prihlasenia AS spodna_hranica
FROM pristupy
--tu môže byť WHERE datum_prihlasenia >= '31.12.2005'
UNION --union, aby neboli zbytočné duplicity
SELECT pristupy.datum_odhlasenia
FROM pristupy
--tu môže byť WHERE datum_odhlasenia >= '31.12.2005'
) intervaly ---rozdeľ časovú os na všetky možné intervaly
ON (intervaly.spodna_hranica BETWEEN pristupy.datum_prihlasenia AND pristupy.datum_odhlasenia) --možno odpočítať 1s od datum_odhlasenia, aby sa započítal iba do spodného intervalu a už nie do vrchného
GROUP BY intervaly.spodna_hranica
vrbcik
Profil
kaifman jojo, Tvoje riešenie je praktickejšie a menej náročné, ak príde 40 užívateľov a bude cchieť vidieť tento údaj :-)
kaifman
Profil
jj zvlaste pokud se jeste atribut cas oddeli do zvlast tabulky a nebude klasicky v tabulce uzivatel kam by se na prvni pohle ihned hodil tabulu bych udelal takhle


create table posledniPristup(
uzivatel mediumint unsigned not null primary key,
cas datetime not null
)
Toto téma je uzamčeno. Odpověď nelze zaslat.

0