[PHP & MySQL] Tellen en grouperen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik zit met een probleem wat ik maar niet opgelost krijg.

Ik heb een tabel 'pageview' met de volgende velden

id,datum, ip,script

Nu wil ik over een week weten hoeveel ip adressen er per dag zijn geweest.

Dus als je per dag 2 unieke adressen hebt dan is het per week 7 * 2 = 14.

Een ip adres mag dus de volgende dag weer wel meetellen.
Ik heb nu wel een overzicht per dag met de volgende query maar die wil ik ook in een keer laten optellen omzo geen handelingen meer te doen in php.
Maar ik krijg het niet voormekaar.

PHP:
1
2
3
4
5
6
SELECT COUNT( 
DISTINCT ( ip ) ) 
FROM pageviews
WHERE datum
BETWEEN  '2003-07-27' AND  '2003-08-02'
GROUP  BY datum


hoe kan ik deze query compleet maken?

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Nu online
Je moet 'datum' nog in de select-list zetten.
Je kan slechts groeperen op velden die ook in je select-list staan dacht ik:

code:
1
2
3
select datum, count(ip)
from tabel
group by datum


count(distinct(ip)) moet je dus al niet doen; dit zal nl. verkeerde resultaten kunnen opleveren.
Als je count(distinct(ip)) doet, zullen enkel unieke ip's geteld worden: je zal dan dus voor ieder ip dat voorkomt slechts als count-waarde 1 krijgen.
Het groeperen gebeurt door de group by, dus die distinct laat je er maar uit.

[ Voor 29% gewijzigd door whoami op 01-08-2003 17:06 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
PHP:
1
2
3
4
5
6
7
8
SELECT COUNT( 
DISTINCT (
ip
) ) 
FROM pageviews
WHERE datum
BETWEEN '2003-07-27' AND '2003-08-02'
GROUP BY datum LIMIT 0 , 30


levert het volgende resultaat

PHP:
1
2
3
4
5
6
7
COUNT( DISTINCT ( ip ) )  
33 
43 
34 
36 
39 
13


Maar nu wil ik de som van die aantal in een keer terugkrijgen

Dat is het probleem

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Nu online
Als je COUNT kent, dan zal je SUM ook wel kennen zeker?

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ja die ken ik heus wel, maar hoe laat ik die hierover los dan,

want ik moet eerst het aantal rijen weten van een dag.

Daarvoor gebruik ik distinct en count.

[ Voor 46% gewijzigd door Verwijderd op 01-08-2003 17:24 ]


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Nu online
code:
1
SUM(COUNT(ip))

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
whoami schreef op 01 August 2003 @ 17:05:
count(distinct(ip)) moet je dus al niet doen; dit zal nl. verkeerde resultaten kunnen opleveren.
Als je count(distinct(ip)) doet, zullen enkel unieke ip's geteld worden: je zal dan dus voor ieder ip dat voorkomt slechts als count-waarde 1 krijgen.
Dit moet ook, want ik wil een uniek ip per dag hebben.

Of zie ik het nu verkeerd.

Hoe krijg je anders de unieke ip's per dag om ze vervolgens over die 7 dagen op te tellen.

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Nu online
Verwijderd schreef op 01 August 2003 @ 17:26:
[...]


Dit moet ook, want ik wil een uniek ip per dag hebben.

Of zie ik het nu verkeerd.

Hoe krijg je anders de unieke ip's per dag om ze vervolgens over die 7 dagen op te tellen.
Ok, dan heb je gelijk.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
resultaat

SELECT SUM( COUNT( ip ) ) , datum
FROM pageviews
WHERE datum
BETWEEN '2003-07-27' AND '2003-08-02'
GROUP BY datum
LIMIT 0 , 30

MySQL retourneerde:


Invalid use of group function

Acties:
  • 0 Henk 'm!

Verwijderd

En wat geeft een SUM(COUNT(DISTINCT(ip))) terug?

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Nu online
Als je het totaal van alle unieke ip's wilt tussen twee bepaalde datums, waarom doe je dan geen
code:
1
select count(distinct ip) from tabel where ...

Dus zonder group by expression?

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
whoami, hij wil het unieke aantal users per dag hebben. Als je niet grouped per dag, dan telt een IP maar 1x over de hele periode.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

code:
1
2
3
select datum, count(*)
from tabel
group by datum, ip

Who is John Galt?


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 15:29

MBV

van justmental ziet er goed uit, ik zou alleen count ip doen.

Acties:
  • 0 Henk 'm!

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 16-08 17:16
Ik denk dat het belangrijker is om eerst vast te stellen wat je onder 'totaal' verstaat.

Stel dat er een week lang elke dag 10 (dezelfde!) bezoekers komen. Per dag heb je dan 10 unieke bezoekers, da's simpel. Maar heb je als totaal voor die week nou 10 of 70 unieke bezoekers?

Volgens mij zijn het er tien. Om aan dat getal te komen, maar ook om het totaal per dag te kunnen specificeren, heb je twee queries nodig.

Deze voor de dagtotalen (die had je al):

code:
1
2
3
4
5
SELECT COUNT(DISTINCT (ip ) ) 
FROM pageviews 
WHERE datum 
BETWEEN '2003-07-27' AND '2003-08-02' 
GROUP BY datum

En een voor het totaal:
code:
1
2
3
4
SELECT COUNT(DISTINCT (ip ) ) 
FROM pageviews 
WHERE datum 
BETWEEN '2003-07-27' AND '2003-08-02'
Als je gewoon het totaal van alle dagen wilt (totaal 70 dus) dan kan je toch wel dat éne regeltje php:
PHP:
1
$weektotaal += $myrow['dagtotaal'];
in je loopje toevoegen? :?

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Nu online
Grijze Vos schreef op 01 August 2003 @ 20:12:
whoami, hij wil het unieke aantal users per dag hebben. Als je niet grouped per dag, dan telt een IP maar 1x over de hele periode.
Wat is het nu, wil hij het totaal per dag binnen een bepaalde periode (dus, zoals justmental's oplossing en diegene die ik in m'n eerste reply al gezet had), of wil hij het totaal aantal unieke ip-adressen binnen een bepaalde periode?

In SQL Server heb je zoiets als een GROUP BY WITH CUBE. Die gaat dan per groep nog eens een totaal maken; ik weet niet of MySQL ook zoiets heeft...
code:
1
2
3
4
SELECT datum, count(distinct ip)
from tabel
where datum between ...
group by datum with cube


Krijg je bv:
code:
1
2
3
4
14-07-2003    5
15-07-2003    4
16-07-2003    6
NULL             15

[ Voor 29% gewijzigd door whoami op 02-08-2003 10:54 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Nu online
justmental schreef op 01 August 2003 @ 20:16:
code:
1
2
3
select datum, count(*)
from tabel
group by datum, ip
Group by datum, ip zal in dit geval niet werken. De enige column in je select list die geen aggregated function is, is in dit geval datum. Dat is dus ook de enige column die je in je group by mag zetten.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

whoami schreef op 02 augustus 2003 @ 11:09:
Group by datum, ip zal in dit geval niet werken. De enige column in je select list die geen aggregated function is, is in dit geval datum. Dat is dus ook de enige column die je in je group by mag zetten.
In Oracle mag dit wel, maar het geeft idd. niet het gewenste resultaat.
Dit wel:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SQL> create table pageviews 
  2 (id number, datum date, ip varchar2(16), script varchar2(200));
SQL> insert into pageviews values (1, trunc(sysdate), '200.200.200.200','test');
SQL> insert into pageviews values (2, trunc(sysdate), '200.200.200.200','test2');
SQL> insert into pageviews values (3, trunc(sysdate-1), '200.200.200.201','test');
SQL> insert into pageviews values (4, trunc(sysdate-1), '200.200.200.200','test');
SQL> select datum, count(distinct ip)
  2  from pageviews
  3  group by datum
  4  /

DATUM    COUNT(DISTINCTIP)
-------- -----------------
01-08-03                 2
02-08-03                 1

Who is John Galt?


Acties:
  • 0 Henk 'm!

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 16-08 17:16
whoami schreef op 02 August 2003 @ 10:52:
[...]In SQL Server heb je zoiets als een GROUP BY WITH CUBE. Die gaat dan per groep nog eens een totaal maken; ik weet niet of MySQL ook zoiets heeft...
In MySQL heb ik het niet kunnen vinden. Maar ik heb wel een vraagje over hoe MSSQL dat doet; telt hij waarden uit de afzonderlijke rijen op of doet hij de berekening voor de hele tabel (zonder GROUP BY dus) opnieuw?

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.

Pagina: 1