Avatar billede Slettet bruger
15. maj 2010 - 15:45 Der er 16 kommentarer og
2 løsninger

Hjælp til MySQL-Query

Hej Eksperter
- jeg kunne ikke finde en kategori til MySQL, så jeg smider den bare ind her :)

Jeg skal tælle antal online supportere på et site, helst så optimeret som muligt, så jeg havde tænkt mig at snore mig helt udenom PHP og lave det i en enkelt MySQL query - men jeg har et problem!

MIN TABEL
id: int (auto_increment)
user_id: int (supporterens login id)
time: timestamp (tid ved event)
action: enum('login','logout','check') (handling)

Ved login sættes en række med action=login, derefter opdateres en ny række med action=check hvert 20. sekund, som opdaterer time=NOW(), for at tjekke at supporteren er på siden. Jeg regner med en timeout tid på 25s. Når supporteren trykker logout sættes en ny række ind med action=logout og opdateringen af action=check stopper selvfølgelig.

Nu vil jeg ved hjælp af MySQL tælle antal supportere online - jeg vil gøre således:

SELECT COUNT(DISTINCT user_id) AS num
FROM RLSLoginActivity
WHERE action IN ('check','login')
AND time>=SUBTIME(NOW(), '00:00:25')

Den mangler bare at tage højde for logout-funktionen. Den skal altså ikke tælle rækkerne med, hvor der er en række med action=logout og time>action=login-time. Hvad skal jeg gøre?

Jeg håber I kan følge mig ;)

Caspar
Avatar billede w13 Novice
15. maj 2010 - 16:01 #1
Tagerdin SQL-sætning ikke højde for disse ting nu?
Avatar billede Slettet bruger
15. maj 2010 - 16:09 #2
Nej - den tager kun højde for login og check - ikke logout. Dette skal bruges på en side med flere tusinde besøgende om dagen, derfor er det vigtigt at der ikke er noget delay på.
Avatar billede w13 Novice
15. maj 2010 - 16:14 #3
Men skrev du ikke i din første post, at den ikke skulle tælle logout med? Det synes jeg da heller ikke, den gør nu.
Avatar billede w13 Novice
15. maj 2010 - 16:15 #4
Eller misforstår jeg helt? :)
Avatar billede Slettet bruger
15. maj 2010 - 16:18 #5
Der har du misforstået mig. Den tager IKKE højde for logout, og det skal den :)
Avatar billede w13 Novice
15. maj 2010 - 16:29 #6
Er det så ikke bare at rette:
IN ('check', 'login')
til:
IN ('check', 'login', 'logout')
??
Eller hvad? :) Er jeg helt galt på den?
Avatar billede RexReptiles Nybegynder
15. maj 2010 - 17:31 #7
<?
$sql = mysql_query("SELECT DISTINCT user_id WHERE action !="logout"
AND time >= SUBTIME(NOW(), '00:00:25')";

echo "Supportere online: ".mysql_num_rows($sql);
?>
Avatar billede RexReptiles Nybegynder
15. maj 2010 - 17:33 #8
ups:

<?
$sql = mysql_query("SELECT DISTINCT user_id FROM RLSLoginActivity WHERE action !="logout"
AND time >= SUBTIME(NOW(), '00:00:25')";

echo "Supportere online: ".mysql_num_rows($sql);
?>
Avatar billede RexReptiles Nybegynder
15. maj 2010 - 17:38 #9
hvis du bare bruger time() kan du også bare sige:

time < time()-25;
Avatar billede RexReptiles Nybegynder
15. maj 2010 - 17:43 #10
eller endnu bedre ved check og login

indsæt time()+25;

og så bagefter

<?
$sql = mysql_query("SELECT DISTINCT user_id FROM RLSLoginActivity WHERE action !="logout"
AND time >= '".time()."'");

echo "Supportere online: ".mysql_num_rows($sql);
?>
Avatar billede Slettet bruger
15. maj 2010 - 17:53 #11
Jeg tror ikke i forstår min problemstilling. Ved tryk på Logout-knappen (fra supporterens side af) indsættes en ny række med action = logout. Så snart den trykkes på, skal supporteren anses som værende offline - ikke 25 sekunder senere. Det regelmæssige check er blot for at undersøge, om supporteren har lukket vinduet uden at trykke logout.
Avatar billede RexReptiles Nybegynder
15. maj 2010 - 17:58 #12
where action !='logout' løser jo det problem
Avatar billede RexReptiles Nybegynder
15. maj 2010 - 18:00 #13
og du skal ikke indsætte nye rækker hele tiden - det lyder da åndsvagt - du skal da update where user-id = $user-id

ellers har du jo lynhurtigt 1000 rækkers lort i din tabel.
Avatar billede RexReptiles Nybegynder
15. maj 2010 - 18:02 #14
samtidigt kan du meget mere med dine data - såsom flette tabeler med supporter navne og andre ting - nye rækker til hver besøg lyder mere som en hit counter.
Avatar billede Slettet bruger
15. maj 2010 - 18:19 #15
Nej, det gør den nemlig ikke. I dit eksempel vil en supporter stadig fremstå online 25 sekunder efter han har trykket på knappen.

Jeg indsætter ikke nye rækker i min tabel hele tiden - check bliver opdateret, således er der 3 rækker (login, check, logout) for hvert 'idéelt' besøg.
Avatar billede RexReptiles Nybegynder
16. maj 2010 - 07:14 #16
indsæt time()+25;

tid i sekuder siden 1970 + 25 - enig?

SELECT DISTINCT user_id

vælg unik id - enig?

WHERE action !="logout"

hvor bruger ikke er logget ud - enig?

- action - logout var vel det du selv sagde den skulle springe over, du kan selv pynte på med AND action !="spiser AND action !="skider" AND action !="i føtex" - eller hvis action skal være noget bestemt AND action = "onanere"

AND time >= '".time()."

og hvor tid i rækken er større eller ens med tid nu.

dem som ikke trykker blir vist i 25 sek.

fordi vi indsatte time + 25.


det her ser ganske logisk ud hos mig.

og det er ik noget jeg ik har lavet før.

hvordan du bruger det i forbindelse med dit eget check osv er det eneste som kan fucke op her.
Avatar billede Slettet bruger
16. maj 2010 - 20:56 #17
Den skal ikke springe logout over. Hvis der er en logout senere end en login skal den overrule alle checks og sige personen er offline.

I dit tilfælde, vil en supporter være online i op til 25 sekunder efter han har trykket på logout.
Avatar billede RexReptiles Nybegynder
17. maj 2010 - 04:03 #18
altså er du seriøs eller pisser du på mig - den tæller ikke logouts med ved det der udtræk.

den springer dem nemlig over - det er hele ide'en så blir de ik talt - da de er logget ud er der ingen logisk grund til at checke dem op imod noget andet pånær ens insert og tabel er hjernedødt dumt skruet sammen.

dernest har du en login og en check.

som jeg heller ikke ser nødvendige,  - du har kun brug for en række i din tabel til hver supporter.

id - status - time

// login

mysql_query("UPDATE supportere SET time='".time()."', status='login' WHERE id='".$user['id']."'");

// update

mysql_query("UPDATE supportere SET time='".time()."' WHERE id='".$user['id']."'");

// logout

mysql_query("UPDATE supportere SET status='logout' WHERE id='".$user['id']."'");


// output

$sql = mysql_query("SELECT DISTINCT id FROM supportere WHERE status !="logout"
AND time >= '".time()."'");

echo "Supportere online: ".mysql_num_rows($sql);
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester