Avatar billede -kenner- Nybegynder
26. maj 2009 - 15:26 Der er 6 kommentarer

Gruppere efter kolonne 1 og sortere efter antallet af forekomster af kolonne 1

Hej eksperter,

Jeg er ved at programmere et script der viser mine besøgende på min hjemmeside. Jeg har lavet noget kode, der viser hvilke domæner der har henvist besøgende, og hvor mange de har henvist. Imidlertid kan jeg ikke se mig ud af hvordan jeg kan sortere på antallet af forekomster af domænet.

pt. laver den en tabel, hvor domænenavne og antal fremgår, men de er ikke sorteret efter antal, som ønsket.

Min kode ser således ud:

$result = mysql_query("select DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(Reference,'www.', ''),'/', '3'),'/', '-2') as Ref from Statistik where REPLACE(SUBSTRING_INDEX(Side,'/', '3'),'www.', '') = '".$Site."' and Reference != '' AND Tid > $start_tid AND Tid < $slut_tid order by Ref") or die(mysql_error());
    while ($row = mysql_fetch_array($result)){
   
    $match = str_replace("/","",$row['Ref']);
       
    $Referencer = mysql_fetch_assoc(mysql_query("select COUNT(*) as antal from Statistik where REPLACE(SUBSTRING_INDEX(Side,'/', '3'),'www.', '') = '".$Site."' AND Reference LIKE '%$match%' AND Tid > $start_tid AND Tid < $slut_tid"));   
       
echo "<tr><td><a href=\"$row[Ref]\" target=\"_blank\">$match</a></td><td>$Referencer[antal]</td></tr>";
Avatar billede majbom Novice
26. maj 2009 - 15:54 #1
du kan jo lave en COUNT(id) AS antal i din første query, så du slipper for at lave en query for hver række den løber igennem.
og derefter sætte GROUP BY antal.
Avatar billede ebusiness Nybegynder
26. maj 2009 - 16:38 #2
Det ligner mest af alt SQL creep det der, du har det langt mere gennemskuelige PHP sprog lige ved hånden og alligevel forsøger du at gøre det hele med SQL. Hvis du skal bruge de fleste eller alle rækker i en tabel så er det smarteste ofte at trække hele tabellen ind og så viderebehandle vha. PHP.

Det allersmarteste er (selvfølgelig) at du foretager første behandling af dine data allerede når de bliver genereret, lav en tabel med tre kolonner: domæne, tidsinterval og antal. Så definerer du en passende tidsopdeling (fx hvert døgn for sig), og når så du får et besøg opretter eller opdaterer du rækken for den pågældende domæne/tidsinterval kombination. På den måde får du færre rækker og hurtigere udtræk af data
Avatar billede -kenner- Nybegynder
27. maj 2009 - 11:38 #3
splazz > jeg er ikke helt sikekr på hvordan jeg skal skrive det, er dette helt forkert:

$result = mysql_query("select COUNT(*) as antal from Statistik where REPLACE(SUBSTRING_INDEX(Side,'/', '3'),'www.', '') = '".$Site."' and Reference != '' AND Tid > $start_tid AND Tid < $slut_tid and GROUP BY SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(Reference,'www.', ''),'/', '3'),'/', '-2') as Ref order by Ref") or die(mysql_error());

ebusiness > Jeg bruge de samme data til flere analyseformål, og ikke alle data er de samme for de rækker der evt. kunne grupperes. f.eks. skærmstørrelse, browser, operativt system, IP, m.v.
Avatar billede majbom Novice
27. maj 2009 - 12:05 #4
ja det ser meget rigtigt ud, så skal du bare have en group by antal på til sidst
Avatar billede ebusiness Nybegynder
27. maj 2009 - 13:10 #5
Jeg har ikke sagt at du skulle nedlægge den tabel du allerede har.
Avatar billede majbom Novice
04. november 2010 - 11:35 #6
kom du videre?
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

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