Avatar billede Slettet bruger
20. maj 2005 - 19:50 Der er 3 kommentarer og
1 løsning

Nested sets - hente antallet er posts i anden tabel

Hej!

Jeg er i gang med at lave en henvisnings statistik.
Derfor opdeler jeg de urls som brugerne kommer fra på følgende måde:

Eksempelvis kommer der en bruger fra http://www.eksperten.dk/spm/1. Denne url bliver så opdelt til http://www.eksperten.dk og spm og 1. De indsættes i en tabel med felterne:
id - primary key, auto_increment
tekst - varchar 255, eksempelvis "http://www.eksperten.dk" eller "spm".
parent - int, navnet på det post som den ligger under, eksempelvis vil "spm" her have ID på det post som indeholder "http://www.eksperten.dk" som parent.

Det sidste post for hver henvisning, her "1" vil yderligere få tilføjet den fuldstændige URL, såldes at der kan sendes videre til den, om nødvendigt.

Jeg har nu lavet en oversigt hvor det er muligt at køre op og ned gennem niveauerne:

<?php
        if (is_numeric($_GET[parent])) { $parent = $_GET[parent]; } else { $parent = 0; }
        $data = $db->query("SELECT tekst, id FROM s_referers WHERE parent = '$parent'");
        while ($row = mysql_fetch_array($data)) {
            echo "<a href='admin.php?p=referers&parent=$row[id]'>$row[tekst]</a><br />";
        }
?>

Nu er mit spørgsmål så hvordan jeg får talt antallet af poster i tabellen s_pageviews som har feltet "referer" sat til id på et af niveauerne som er UNDER det niveau som blev returneret af queriet ovenfor. Det skal naturligvis tælles for hvert enkelt post returneret.

Jeg håber jeg har udtrykt mig forståeligt :)
Avatar billede olleolleolle Nybegynder
24. maj 2005 - 13:00 #1
Jeg prøver at forstå her.

" UNDER det niveau som blev returneret af queriet ovenfor"

Hvis vi starter med $parent=0, altså roden.

Ah, jeg er med. Er vi igang med at lave en branch-og-leaf-struktur?

a. Hver post har en parent.
b. Den som ikke har en parent er i roden.

"Det skal naturligvis tælles for hvert enkelt post returneret."

Den fangede jeg ikke lige. Men, det stopper mig jo ikke fra at spekulere over hvad du har spurgt om.

Vent lidt nu! Nu har jeg så læst spørgsmålet mere nøjagtigt.

1. Du skal splitte en url op.
2. Dets dele skal opbevares i en database.
3. Denne db skal spørges om eksakt hvad? Noget om statistik på sig selv, v.h.a. statustikfunktioner og GROUP BY i MySQL.

Men, jeg er forvirret: Hvorfor er det data værdifuldt i en database? Er ikke det her en log-file-opgave? Værktøjer for at parse logfiles er vel over det hele?
Avatar billede Slettet bruger
25. maj 2005 - 17:14 #2
Jeg har en tabel over besøg (s_pageviews). Denne tabel inderholder et felt som refererer til et ID nummer i tabellen over henvisninger. Dette ID nummer er ID nummeret på det post i reference tabellen som ligger "nederst".

Det jeg så skal hente er antallet af poster i s_pageviews der henviser til det ID i reference tabellen jeg vil tælle for + antallet af poster i s_pageviews som henviser til  et post som har parent = den reference jeg tæller for. Foruden det skal børne-børnene, oldebørnene osv også tælles med.

Jeg håber det var svar nok.
Avatar billede Slettet bruger
25. maj 2005 - 17:17 #3
Jeg har lavet følgende kode til det, men den virker kun ved øverste niveau. Resten ser den ud til at double eller noget i den stil.

Koden bliver jeg nødt til at køre som et cronjob, da den tager en del tid at udføre.

<?
/* Cronjob til opdatering af statistik */
require("db.php");
$db = new mysql;

function key_in_array($needle, $haystack) {
  $haystack = array_flip($haystack);
  if (in_array($needle, $haystack))
  {
      return true;
  } else {
      return false;
  }
}

function num_subs ($parent, $antal=0, $parents=array()) {
    global $db;
    global $antal;
    $sql = "SELECT COUNT(s_pageviews.id) as antal FROM s_pageviews WHERE s_pageviews.referrer = '$parent'";
    $data = $db->query($sql);
    $row = mysql_fetch_row($data);
    $antal = $antal+$row[0];
    $data2 = $db->query("SELECT id FROM s_referers WHERE parent = '$parent'");
    while ($row2 = mysql_fetch_array($data2)) {
        num_subs($row2[id], $antal);
    }
    return $antal;
}

$data = $db->query("SELECT tekst, id FROM s_referers WHERE parent = 0");
while ($row = mysql_fetch_array($data)) {
    $antal = 0;
    run_through_referers($row[id], 0);
}

function run_through_referers ($parent, $level) {
    global $db;
    global $antal;
    $antal2 = num_subs($parent);
    $db->query("UPDATE s_referers SET antal=".$antal2." WHERE id = $parent");
    $data = $db->query("SELECT id, tekst FROM s_referers WHERE parent = '$parent'");
    while ($row2 = mysql_fetch_array($data)) {
        for ($i = 0; $i < $level*3; $i++) {
            echo "&nbsp;";
        }
        echo $row2[tekst]."<br />";
        run_through_referers($row2[id], $level+1);
    }
    return true;
}
?>
Avatar billede Slettet bruger
20. juni 2006 - 18:48 #4
jeg lukker
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