[MySQL] Moment van meeste sessies en het aantal

Pagina: 1
Acties:

  • Fl4sh3r
  • Registratie: Juni 2002
  • Laatst online: 02-10-2023
Beste GoTers,

Ik zit met een lastig MySQL probleem. In de MySQL database worden gegevens van sessies bewaard. Nu wil ik graag weten op welk moment er de meeste gelijktijdige sessies waren en hoeveel dat er waren.

De relevante velden in de tabel sessions zijn start en active.
- start is het moment waarop de sessie begon
- active is het laatste moment van actie van de sessie

Een sessie wordt iedere 30 seconden geactiveerd en wordt als verlopen gezien na 120 seconden.

Graag zou ik het oplossen in MySQL, maar als dat niet mogelijk is kan ik een deel in de PHP-pagina doen.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 30-11 15:10

Creepy

Tactical Espionage Splatterer

En wat heb je zelf al geprobeerd? Wat ging daar niet goed mee? Kreeg je misschien foutmeldingen?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Fl4sh3r
  • Registratie: Juni 2002
  • Laatst online: 02-10-2023
Ik weet dat het de bedoeling is dat ik eerst zelf probeer, maar ik heb werkelijk geen idee waar ik moet beginnen.

Mijn verstand van MySQL is niet 0, maar bij dit probleem zit ik volledig vast.

Verwijderd

SQL:
1
select count(*) from sessions where start <= <momentopname> and active >= <momentopname>

Zoiets?

  • Fl4sh3r
  • Registratie: Juni 2002
  • Laatst online: 02-10-2023
Afterlife: dat lijkt mij inderdaad ook een goeie manier om het aantal sessies te achterhalen op een bepaald moment.
Nu is de vraag alleen nog hoe ik het moment met de meeste sessies achterhaal.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 07:54

Janoz

Moderator Devschuur®

!litemod

Achteraf uit de database halen gaat erg lastig worden. Je zult het op een manier als afterlife moeten doen, maar neem je de stappen tussend e momenten te groot dan kun je sessies missen, neem je ze te klein dan wordt de load te zwaar.

Je zou het ook op kunnen lossen door het bij te houden in je applicatie, maar daarvoor is php niet geschikt omdat je altijd van requests afhankelijk bent en niet een stukje code uit kunt voeren op het moment dat jij wilt. Je zou echter een heel eind kunnen komen door de sessie handlers aan te passen en op 1 of andere manier twee waarden bij houden. De ene verhoog je bij een nieuwe sessie. Als deze groter is dan de ander wordt de ander gelijk (de tweede is dus je max). Zodra een sessie verloopt (door de sessie garbage collector, deze draait echter niet altijd waardoor je nooit zekerheid hebt) verlaag je de eerst waarde weer.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
misschien zoiets:

SQL:
1
2
3
4
5
6
7
8
9
10
11
select 
sessietabel.*,
count(subtabel.id) as aantal_sessies_op_moment_deze_sessie
from
sessietabel
left join
sessietabel subtabel
on
(subtabel.tijd <= sessiontabel.tijd AND subtabel.tijd >= datesub(sessiontabel.tijd, interval 120 second)
order by 
aantal_sessies_op_moment_deze_sessie desc


niet getest, maar dit moet volgens mij doen wat je wilt...

(edit: even groter dan en kleiner dan tekens gewisseld, stonden verkeerd om... en dateadd in datesub gewijzigd)

[ Voor 30% gewijzigd door P.O. Box op 27-03-2007 14:44 ]


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
Ik weet niet hoe anderen daar over denken, maar ik zou het toch prettig vinden om te horen of je tot een oplossing gekomen bent (en welke) als ik er tijd in heb gestoken om te helpen... :(

  • Fl4sh3r
  • Registratie: Juni 2002
  • Laatst online: 02-10-2023
Ik heb nog geen oplossing gevonden.

Ik ben inderdaad verder gegaan met de door jouw aangedragen oplossing, maar het wil nog niet lukken zoals ik het wil.

edit:
Deze query heb ik uiteindelijk gebouwd met de hulp van jouw voorbeeld:
SQL:
1
2
3
4
5
6
7
8
9
SELECT
sessions.*, COUNT(subtabel.sessionid)
FROM
sessions
LEFT JOIN
sessions AS subtabel
ON
(subtabel.start <= sessions.start AND subtabel.start>= SUBDATE(sessions.start, INTERVAL 2 MINUTE))
GROUP BY sessions.sessionid


Helaas, duurt deze query uitvoeren enorm lang en bovendien weet ik dan alleen het aantal sessions tijdens tijdens sessies. Om daar verder iets mee te kunnen moet er nog meer gebeuren. Want als 1 sessie toevallig 3 dagen duurt is het niet zo gek dat daarin meer sessies zijn dan tijdens veel kortere sessies. Dit betekent echter niet automatisch dat dit ook echt het drukste moment was.

Bedankt iig zover voor jullie inspanning, ik denk dat ik het er voorlopig maar even bij laat. De prioriteit ervan is niet hoog.

[ Voor 73% gewijzigd door Fl4sh3r op 30-03-2007 19:02 ]

Pagina: 1