29. april 2007 - 15:05Der er
36 kommentarer og 1 løsning
Hjælp med top10
Jeg er igang med at lave en form for top10 liste. Listen bliver lavet udfra hvor mange hits de forskellige videoer på min hjemmeside har fået.
Når jeg laver listen ser min kode således ud:
<?php include "include/connect.txt";
$query = mysql_query("SELECT * FROM htv_video ORDER by hits DESC limit 10"); while($data = mysql_fetch_array($query)) {
echo ''.$data[titel].'<br>';
} ?>
Nu viser den hvilke videoer der har fået flest hits ialt. Men hvad nu hvis jeg gerne vil vise hvem der har fået flest hits inden for den sidste uge. Hvordan gør jeg det?
Kommunerne har digitaliseret indgangen for borgerne. Men bag skærmen håndteres mange arbejdsgange stadig manuelt mellem systemer, mails og organisatoriske siloer.
Så bliver du nødt til at gemme dine hits med et timestamp. Du kan enten gemme dem hver i sær (én record pr. hit) eller pr. uge o.lign. Den første løsning muliggør de mest interessante beregninger.
Din hits-tabel skal blot have timestamp og fremmednøgle (i.e. nøglen / ID for den enkelte video).
Derefter kan du gruppere pr. nøgle og uge som sorteres efter uge...
Nu gemmer den hvert hit med videoid'et og en dato.
Nu vil jeg så gerne lave en side der viser hvilke videoer der er mest besøgt inden for den seneste uge. Skal jeg så ud i noget som det Bauerdata skrev i det første indlæg?
Jeg er ikke sikker på om jeg har gjort det rigtige, fordi lige nu får jeg bare en blank side. Her er min kode
<?php include "include/connect.txt";
$query = mysql_query("select videoid, count(*) as hits from htv_hits WHERE DATE_SUB(CURDATE(),INTERVAL 7 DAY) <= timestamp group by videoid order by hits limit 10"); while($data = mysql_fetch_array($query)) {
select h.videoid, count(h.*) as hists, v.* from htv_hits AS h, htv_video AS v WHERE DATE_SUB(CURDATE(),INTERVAL 7 DAY) <= h.timestamp AND h.videoid = v.id group by h.videoid order by h.hists limit 10
$query = mysql_query("select h.videoid, count(h.*) as hists, v.* from htv_hits AS h, htv_video AS v WHERE DATE_SUB(CURDATE(),INTERVAL 7 DAY) <= h.timestamp AND h.videoid = v.id group by h.videoid order by h.hists limit 10"); while($data = mysql_fetch_array($query)) {
Kan godt være jeg spørger dumt, men kan det være fordi der ikke er gået 7 dage endnu og at den først viser resultatet når den har kunne tælle hits fra 7 dage.
Ok - så fortsætter vi derfra. Vi beholder bare den nuværende join, da vi ikke er interesserede i videoer uden hits.
SELECT v.*, COUNT(h.videoid) AS cnthits FROM htv_video AS v, htv_hits AS h WHERE v.id = h.videoid GROUP BY h.videoid ORDER BY COUNT(h.videoid) DESC, v.titel ASC
Det giver ikke dem med flest hits i denne uge, men den betingelse tager vi senere. Denne skulle gerne give et korrekt tal (cnthits) for hver video.
Nu ser min kode såldes ud, men det giver en blank side:
<?php include "include/connect.txt";
$video = mysql_query ("SELECT v.*, COUNT(h.videoid) AS cnthits FROM htv_video AS v, htv_hits AS h WHERE v.id = h.videoid GROUP BY h.videoid ORDER BY COUNT(h.videoid) DESC, v.titel ASC");
Hov, jeg har ikke lige fået set mine mails i gennem. Jeg undrer mig over at ovenstående ikke giver data. Du har nogle records i "hits"-tabellen? Ellers prøver vi en LEFT JOIN:
Prøv følgende:
<?php
include "include/connect.txt";
$video = mysql_query('SELECT v.*, COUNT(*) AS cnthits FROM htv_video AS v LEFT JOIN htv_hits AS h ON v.id = h.videoid GROUP BY h.videoid ORDER BY COUNT(*) DESC, v.titel ASC') or die(mysql_error());
$video = mysql_query('SELECT v.*, COUNT(*) AS cnthits FROM htv_video AS v LEFT JOIN htv_hits AS h ON v.id = h.videoid WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= h.date GROUP BY h.videoid ORDER BY COUNT(*) DESC, v.titel ASC') or die(mysql_error());
Måske er det så mig, der bare har lavet en brain fart :)
Prøv
<?php
include "include/connect.txt";
$video = mysql_query('SELECT v.*, COUNT(*) AS cnthits FROM htv_video AS v LEFT JOIN htv_hits AS h ON v.id = h.videoid WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= h.date GROUP BY h.videoid ORDER BY cnthits DESC, v.titel ASC') or die(mysql_error());
Hehe ja, har dog prøvet at ændre 7 DAY til 1 DAY og så bliver tallet mindre :-) så det ser ud til at virke
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.