Avatar billede jkampmann Nybegynder
19. november 2007 - 14:42 Der er 7 kommentarer og
1 løsning

Dagens spil - hvordan laves det?

Hvordan laves "Dagens spil"? Jeg har et felt der hedder "hits", men den skal vel også tjekke hvad dag det er?

Altså vil udtrække et spil der er blevet spillet mest i dag.
Avatar billede pidgeot Nybegynder
19. november 2007 - 14:54 #1
Du skal have en tabel der registrerer de enkelte hits pr. person og laver sammentælling ud fra en given dato (noget a la SELECT spil_id, count(*) FROM hits WHERE dato>... GROUP BY spil_id). Hvad du skal angive som kriterie for dato afhænger af om du med "i dag" mener "sidste 24 timer" eller "dags dato" (i sidste tilfælde vil hits altid stå til 0 når vi rammer midnat, hvilket nok ikke er intentionen).

Din nuværende struktur med at gemme antallet på selve spillet, duer kun hvis du konsekvent nulstiller ved midnat (det skal så være en automatiseret proces, eks. et cronjob), ikke vil have historiske data, og er ligeglad med at der er gengangere (samme person der spiller samme spil flere gange på en dag).

Hvis du er ligeglad med gengangere, men gerne vil have historik, så kan du have en tabel der har én række pr. dag pr. spil, der så bliver talt op som nødvendigt (INSERT INTO (spil_id,dato,hits) VALUES ($spil_id,CURDATE(),1) ON DUPLICATE KEY UPDATE hits=hits+1). Det forudsætter dog at du ikke mener "mest populære inden for de sidste 24 timer", men "mest populære dags dato".
Avatar billede jkampmann Nybegynder
20. november 2007 - 19:00 #2
Kan jeg ikke oprette en tabel der kaldes "kliks", og kolonnerne "id, timestamp, game_id, hits", hvorefter når en besøger spillet indsætter jeg..

$SQL = "INSERT INTO (`game_id`,`timestamp`,`hits`) VALUES ($spil_id,CURDATE(),1) ON DUPLICATE KEY UPDATE hits=hits+1";
mysql_query($SQL) or die(mysql_error());

Så hvis den allerede findes, vil den bare opdatere hits med +1 ikke?

Hvad giver CURDATE() ? hvorfor ikke bruge time() ?

.. Det skal være de sidste 24 timer.
Avatar billede pidgeot Nybegynder
20. november 2007 - 19:33 #3
CURDATE() var under den forudsætning du mente "0:00-23:59". Det ville have givet dig den aktuelle dato uden tidspunkt.

Din ide er NÆSTEN som den skal være, men du skal ikke have et "hits" felt med, og der er intet med ON DUPLICATE KEY - du skal bare bruge COUNT(*) med GROUP BY game_id for at tælle hvor mange rækker der er for et givent spil i et givent tidsrum (=antal hits i perioden), og så bare have en række pr. klik. Sørg for et indeks på timestamp,game_id, da antallet af rækker nemt kan løbe op.

Tanken med det sidste af mine forslag var at primærnøglen var spil_id,dato, og der altså ikke var nogen anden ID-kolonne (ellers ville ON DUPLICATE KEY ikke fungere) - på den måde kunne du selecte alle rækker med den pågældende dato, og sortere efter hits-kolonnen for at få dem i den ønskede rækkefølge (totalen var beregnet på forhånd). Når du mener "sidste 24 timer", skal du dog have den ID-kolonne med for at det bliver mere effektivt (COUNT er hurtigere end SUM når vi har det her indeks).
Avatar billede jkampmann Nybegynder
20. november 2007 - 19:59 #4
Okay. Hvordan skal jeg så udpege dagens spil? Det er noget med tid jo.

Hvis jeg nu benytter time()

SELECT COUNT(*) as Antal, col FROM tabel WHERE timestamp > ???? AND Antal DESC LIMIT 0,1

??
Avatar billede pidgeot Nybegynder
20. november 2007 - 20:46 #5
Hvis du bruger et timestamp (altså et resultat fra time(), og ikke en DATETIME) så bruger du:

$timestamp=time()-86400; (træk 24 timer fra aktuelt tidspunkt);
mysql_query('SELECT COUNT(*) as Antal, col FROM tabel WHERE timestamp > ' . $timestamp . ' GROUP BY spil_id ORDER BY Antal DESC LIMIT 1');

(Jeg glemmer altid om ORDER BY skal før GROUP BY eller ej, men virker det ikke, så prøv at bytte om på dem.)
Avatar billede jkampmann Nybegynder
21. november 2007 - 03:20 #6
Tusind tak - så virker det.
www.spil.us - smid svar, og tak for hjælpen.
Avatar billede pidgeot Nybegynder
21. november 2007 - 09:01 #7
Værsgo :)
Avatar billede jkampmann Nybegynder
28. november 2007 - 18:50 #8
Kan man ikke lave en mysql_query("....") i index.php filen, som automatisk sletter hvis den er under dagen, eller sådan noget? Kunne du ikke hjælpe mig lidt her.. for den viser det samme spil hver dag :(
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