[PHP/MYSQL] Sessies tellen

Pagina: 1
Acties:
  • 107 views sinds 30-01-2008
  • Reageer

Onderwerpen


  • DaMinD
  • Registratie: Januari 2002
  • Laatst online: 23-06-2024
Ik zit met een probleem.
Ik heb een MySQL db en daar zheb ik 3 colums namelijk: start, end, en time
In start staat de datum en tijd van het begin van een sessie en in end het einde. time staat voor de duur van de sessie.
Nu moet ik een bereking hebben om te kijken hoeveel sessies er tegerlijker tijd open staat.
Ik hoef geen script te hebben alleen een kickstart zodat ik weet hoe ik dit aan moet pakken.

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

kijken waar _nu_ tussen _start_ en _end_ vallen? (of waarschijnlijk is end nog niet gevuld, dus waar nu groter dan start en end leeg is)

time is overigens wel beetje dubbel op natuurlijk, als je start en end hebt kun je eenvoudig berekenen wat die time is.

[ Voor 21% gewijzigd door Bosmonster op 16-02-2006 09:50 ]


  • DaMinD
  • Registratie: Januari 2002
  • Laatst online: 23-06-2024
Ik moet kijken hoeveel sessies er tegelijkertijd open staan. Dit moet ik naar hand van de start en end time van de sessies berekenen. En idd, die time is wel een beetje dubbel op, maar die wordt meer gebruikt ter controle.

[ Voor 26% gewijzigd door DaMinD op 16-02-2006 09:51 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

Ja dat zei je in je startpost ook al :D. Wat heb je zelf al geprobeerd? In principe geeft Bosmonster het antwoord al. Combineer dat met een count en je bent klaar lijkt me.

Zou je trouwens via een topicreport een fatsoenlijke titel door kunnen geven?

[ Voor 20% gewijzigd door Janoz op 16-02-2006 09:53 ]

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


  • DaMinD
  • Registratie: Januari 2002
  • Laatst online: 23-06-2024
Het is een history tabel. Dus is er in de meeste record een endtime.
Ik zat te denken aan een lus die kijkt of de endtime in de starttime van het volgende record valt en deze dan tellen, maar daar kwam ik niet helemaal uit.
En de topic title: oeps :D. Ik zal ff een topic report een title change vragen.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

Nogmaals, wat heb je al geprobeert? Heb je een query? Wat lukte daar niet aan? Waarom heb je niks aan "waar _nu_ tussen _start_ en _end_"?

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


  • DaMinD
  • Registratie: Januari 2002
  • Laatst online: 23-06-2024
heb heel waarschijnlijk al een oplossing:
Eerst alle record uitlezen.
Deze dan door een foreach laten lopen en bij elk record de andere records vergelijken of ze tussen de start en end liggen.

  • Eskimootje
  • Registratie: Maart 2002
  • Laatst online: 20:37
Lijkt me niet zo heel erg efficient.

  • PhoeniX-
  • Registratie: Juni 2000
  • Laatst online: 01-09 10:26
DaMinD schreef op donderdag 16 februari 2006 @ 11:04:
heb heel waarschijnlijk al een oplossing:
Eerst alle record uitlezen.
Deze dan door een foreach laten lopen en bij elk record de andere records vergelijken of ze tussen de start en end liggen.
Janoz' opmerking lijkt me erg zinnig .. waarom is dat niets? In MySQL kun je BETWEEN hiervoor gebruiken.

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:04
Je kan toch al in je query die dingen eruit filteren ?
Een SELECT heeft nl. een WHERE clause, waarmee je filters kunt specifieren. Bv de BETWEEN die Phoenix al zegt.

Door je resultset loopen, en ieder record gaan bekijken is gewoon een killer voor de performantie

[ Voor 24% gewijzigd door whoami op 16-02-2006 11:23 ]

https://fgheysels.github.io/


  • DaMinD
  • Registratie: Januari 2002
  • Laatst online: 23-06-2024
Maar ik moet voor elk record controleren of de end time ook voor komt in een ander record.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

DaMinD schreef op donderdag 16 februari 2006 @ 11:31:
Maar ik moet voor elk record controleren of de end time ook voor komt in een ander record.
http://sqlcourse2.com/setoper.html

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

DaMinD schreef op donderdag 16 februari 2006 @ 11:04:
heb heel waarschijnlijk al een oplossing:
Eerst alle record uitlezen.
Deze dan door een foreach laten lopen en bij elk record de andere records vergelijken of ze tussen de start en end liggen.
Das wel leuk als je 1000 (niet zo heel veel) sessie entry's hebt...

Dan heeft je loop 1.000.000 iteraties :P Heb zo'n vermoeden dat dat erg snel, erg traag gaat worden :+

[ Voor 8% gewijzigd door Bosmonster op 16-02-2006 12:18 ]


  • DaMinD
  • Registratie: Januari 2002
  • Laatst online: 23-06-2024
De oplossing is idd traag. Maar het werkt nog steeds niet.
En die BETWEEN gebruik ik al min of meer. Maar dat is niet de oplossing.
dit heb ik nu:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    $hourCount = 0;
    while ($hourCount < 24){
    $sqlHour = str_pad($hourCount, 2, "0", STR_PAD_LEFT);
        $sql = "SELECT id,start, end FROM table ORDER BY start";
        $rs = mysql_query($sql);
        $i = 0;
        while($row = mysql_fetch_array($rs)){
            $sql2  = "SELECT id, start, end FROM table ";
            $sql2 .= "WHERE start >= '".$row['start']."' AND end <= '".$row['end']."' ";
            $result = mysql_query($sql2);
            $num_rows[$hourCount][$i] = mysql_num_rows($result);
            $i++;
        }
        if (isset($num_rows[$hourCount])){
            $arMaxLogins[$hourCount] = max($num_rows[$hourCount]);
        }else{
            $arMaxLogins[$hourCount] = 0;
        }
        $hourCount++;
    }


Het probleem is: nu vergelijkt hij alleen maar 1 entry.
Voorbeeld:
ik heb :
Row1: start 2006-01-01 00:00:20 end 2006-01-01 00:10:00
Row2: start 2006-01-01 00:01:02 end 2006-01-01 00:01:30
Row3: start 2006-01-01 00:02:05 end 2006-01-01 00:07:00

Nu zijn er eigenlijk maar 2 session ter gelijk. Alleen met mijn code zijn er dit 3 omdat hij Row 1 vergelijkt met row2 en 3.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

SQL:
1
2
3
SELECT COUNT(`iets`)
FROM `tabel`
WHERE NOW() BETWEEN `start` AND `end`

:?

[ Voor 5% gewijzigd door NMe op 16-02-2006 19:00 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 18-08 21:31
Wat je met die loop voor elkaar krijgt is: voor elke sessie kijken hoeveel andere sessies er actief waren. Dat kan ook in SQL.

SQL:
1
2
3
SELECT a.start,a.end,a.time,COUNT(b.start) AS [Aantal Sessies]
FROM tabel AS a LEFT JOIN tabel AS b ON b.start <= a.end AND b.end >= a.start
GROUP BY a.start,a.end,a.time


Dit gaat ervan uit dat er geen lopende sessies bestaan/meegerekend hoeven worden.
Pagina: 1