15. maj 2010 - 15:45Der 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?
Tagerdin SQL-sætning ikke højde for disse ting nu?
Synes godt om
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å.
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.
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.
Synes godt om
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.
- 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.
Synes godt om
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.
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);
Synes godt om
Ny brugerNybegynder
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.