Avatar billede xtr0 Nybegynder
01. januar 2006 - 08:08 Der er 14 kommentarer og
1 løsning

Tælle hvor mange unikke rows der findes i tabel

Jeg har en stor tabel med visits på mine brugere, jeg vil nu tælle hvor mange unikke besøg jeg har haft. Det er imidlertid et stort problem for mig at finde ud af eftersom jeg ikke er så erfaren i mysql (Har pt. kun brugt simple queries som select, insert, delete osv.). Jeg har fundet ud af at jeg kan finde gengangere med:
"select ip, count(ip) from visits group by ip having count(ip) > 1"

Min database ser således ud:
id    ip        hostname        time
1    10.10.0.1    tux.lan        NOW()
2    10.10.0.1    tux.lan        NOW()
3    10.10.0.2    beastie.lan    NOW()

Den skal finde unikke ip'er, og tælle duplicates med men kun en gang, så min database burde returnere 2. Har i et forslag til dette?

Godt nytår.
Avatar billede erikjacobsen Ekspert
01. januar 2006 - 08:59 #1
select count(distinct ip) from visits
Avatar billede xtr0 Nybegynder
01. januar 2006 - 09:11 #2
Tæller den ikke kun dem som kun har været der en gang? Den returnerer 1 her.

$sql="select count(distinct ip) from visits";
$db->performQuery($sql);
$unique = $db->getNumRows();
echo"Unique: $unique<br>";

Returnerer:
Unique: 1

Den skal også tælle folk med som har været der flere gange, men den skal kun tælle det en gang. Pt. er der to forskellige ip'er i databasen nemlig 10.10.0.1 & 10.10.0.138, men de er der begge flere gange.
Avatar billede erikjacobsen Ekspert
01. januar 2006 - 09:15 #3
Du får altid een række, men i det felt du får tilbage står der et tal.
Avatar billede xtr0 Nybegynder
01. januar 2006 - 09:52 #4
Aha, Ok, nu virker det, er du sød at oprette et svar? :)
Avatar billede xtr0 Nybegynder
01. januar 2006 - 10:07 #5
Jeg har lige endnu et spørgsmål (Hvis du har lyst til at svare). Hvis jeg nu har en masse af de visits logget. Hvordan kan jeg så opdele dem igen? Hvis jeg nu vil tælle hvor mange forskellige dage der er i databasen (I denne form fx. 2006-01-01) kan den så outputte et array som:
Array
(
    [2006-01-01] => 2
    [2006-01-02] => 2
    [2006-01-03] => 1
}
Avatar billede erikjacobsen Ekspert
01. januar 2006 - 10:43 #6
select `time`,count(*) group by `time` 
Hvis din `time` er et DATE-felt

Jeg samler slet ikke på point, tak.
Avatar billede erikjacobsen Ekspert
01. januar 2006 - 10:43 #7
select `time`,count(*) from visits group by `time`
Avatar billede xtr0 Nybegynder
01. januar 2006 - 11:15 #8
Den outputter, altså kun for en bestemt dato, kan man få den til at printe ud for alle datoerne pt. er det vist kun for en?
Array (
  [time] => 2006-01-01
  [count(*)] => 8
)
Avatar billede erikjacobsen Ekspert
01. januar 2006 - 11:29 #9
Der bliver mange rækker - du skal læse dem allesammen og putte i et array. Hvordan ser din kode ud?
Avatar billede xtr0 Nybegynder
01. januar 2006 - 11:44 #10
<?php
require_once('mysqlconnector.class.php');

// USER INFO (SKAL SMIDES I ARRAY)
$ip = $_SERVER['REMOTE_ADDR'];


$page_loaded = $_SERVER['PHP_SELF'];
$referer = $_SERVER['HTTP_REFERER'];
$hostname = gethostbyaddr($_SERVER['REMOTE_ADDR']);
//* echo "IP: $ip<br>
//* Pageload: $page_loaded<br>
//* Referer: $referer<br>";


$db=&new MySQLConnector('localhost','kawsper','k1chx09g','arto_stats');
// Find ud af hvor mange der har besøgt (Tæller også multi-besøg fra samme ip) aka Hits
//if($ip != "10.10.0.138") {
    $db->performQuery("insert into visits (id, ip, hostname, pageload, referer, time) values ('NULL', '$ip', '$hostname', '$page_loaded', 'none', NOW())");
//}

$sql="SELECT id FROM visits";
$db->performQuery($sql);
$hits = $db->getNumRows();

$sql="select ip, count(ip) from visits group by ip having count(ip) > 1";
$db->performQuery($sql);
$gengangere = $db->getNumRows();

$sql="select count(distinct ip) from visits";
$db->performQuery($sql);
$unique = $db->fetchRow();

$sql="select `time`,count(*) from visits group by `time`";
$db->performQuery($sql);
$stat = $db->fetchRow();
print_r($stat);

//DEBUG
if(isset($_GET["debug"])) {
    echo"Gengangere: $gengangere<br>
    Hits: $hits<br>
    Unique:". $unique['count(distinct ip)'] ."<br>";
}
?>
Avatar billede erikjacobsen Ekspert
01. januar 2006 - 11:47 #11
Du skal have en while-sætning omkring
  $stat = $db->fetchRow();
for at få alle rækker. Eller også kan man gøre noget smart med mysqlconnector.class.php - jeg bruger den ikke selv.
Avatar billede xtr0 Nybegynder
01. januar 2006 - 11:48 #12
Det er så noget jeg har fået lavet af en anden. Med nogle af dine rettelser.
Avatar billede xtr0 Nybegynder
01. januar 2006 - 11:54 #13
Ah sejt, det går jeg igang med at lave så. Mange tak skal du ihvertfald have (Når du ikke modtager points :)).
Avatar billede erikjacobsen Ekspert
01. januar 2006 - 12:25 #14
Det er sikkert nemt nok - hvis man lige kender mysqlconnector.class.php  ;)
Du kan enten vente på nogen, der ved noget om den, eller svare selv, acceptere eget svar.
Avatar billede xtr0 Nybegynder
17. juni 2006 - 15:15 #15
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
Computerworld tilbyder specialiserede kurser i database-management

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