[BC3] [mysql] meerdere counts in een query.

Pagina: 1
Acties:

  • mabarto
  • Registratie: Februari 2001
  • Laatst online: 09-09 12:39
Deze 3 queries gebruik ik om de totalforums, totalposts en totalusers te bereken. Deze staan op dit moment in 3 aparte queries, maar wil deze graag in 1 query.

$totalf_query = mysql_query("SELECT COUNT(*) as totalforums from forum LIMIT 1");
$totalp_query = mysql_query("SELECT COUNT(*) as totalposts from post LIMIT 1");
$totalu_query = mysql_query("SELECT COUNT(*) as totalusers from user LIMIT 1");

Ik heb dit al geprobeerd met het volgende:

$total_query = mysql_query("SELECT COUNT(F.forumid) as totalforums, COUNT(P.postid) as totalposts, COUNT(U.userid) as totalusers FROM forum as F, post as P, user as U");

Als ik deze query uitvoert dan vermenigvuldigt die elke count met elkaar.

Dus als totalforums 5 is en totalposts 5 is en totalusers 5 is, krijg ik gewoon als resultaat: 5*5*5 = 125 bij alle kolommen. Wil dus gewoon 5 krijgen voor elke kolom.

Ik krijg alleen dit voor elkaar als ik 3 aparte queries uitvoert zie boven de goede uitkomst.

Weten jullie hier een goede oplossing voor, wat ik hier fout doe.

Thanks..!!

  • Tsjipmanz
  • Registratie: Oktober 2000
  • Laatst online: 13-05 14:52

Tsjipmanz

Der Rudi ist da

Voor zover ik weet kan dit niet in 1 query in SQL.

In de oplossing die jezelf probeert heb je meerdere counts, en krijg je 5*5*5 resultaten.

Ga na dat wanneer je twee kolommen hebt mt bv in de 1e A en B en in de 2e C en D, dan telt hij de volgende ''combinaties''

A C
A D
B C
B D

Oftewel 2*2 = 4. Dat gebeurt in jouw geval ook. Ik zou het dus gewoon in 3 queries houden (of er moet een guru zijn die het wel kan, ben ik ook geinteresseerd!)

There's no such thing as a mistake, just happy accidents - Bob Ross
Relaxte muziek: altijd okee!
- Soulseek rulez -


Verwijderd

Dit wil je gewoon absoluut niet in 1 query doen, omdat, zelfs al krijg je de query zo herschreven dat het resultaat hetgeen is wat je wil hebben, het veel inefficienter is.

Ook heeft de ''LIMIT 1'' totaal geen effect in dit geval en zou ik het gewoon weglaten.

Je krijgt overigens de vreemde aantallen in die samengebreide query omdat hij, door de select van meerdere tabellen zonder joins daartussen, een cartetisch product van alle records in de tabellen maakt, d.w.z. dat hij alle mogelijke combinaties tussen de records van de 3 tabellen als geldige invoer ziet.

Voor x records in forum, y records in post en z records in user, zullen er x * y * z combinaties zijn. Vervolgens gaat hij al die records tellen, in alle 3 de counts.

Een herschrijving van die query zou zoiets kunnen zijn:
code:
1
2
3
4
5
6
7
8
SELECT
  Distinct Count(F.forumid) as totalforum,
  Distinct Count(P.postid) as totalpost,
  Distinct Count(U.userid) as totaluser
FROM 
  forum as F, 
  post as P, 
  user as U

Ik weet niet of dat gaat werken, en raadt het ten sterkte af om te begruiken als het werkt, maar goed ...

Enjoy :)

Verwijderd

SELECT Distinct Count(F.forumid) as totalforum, Distinct
Count(P.postid) as totalpost, Distinct Count(U.userid) as totaluser FROM forum as F, post as P, user as U
Zou het niet beter zijn?:

SELECT Count(distinct F.forumid) as totalforum,
Count(distinct P.postid) as totalpost, Distinct Count(distinct U.userid) as totaluserFROM forum as F, post as P, user as U

edit:

Heb het even getest dus COUNT(distinct VELDNAAM) dit werkt idd, heb ik een andere geholpen en me zelf ook metee doordat ik een ander hopelijk heb geholpen :)

  • Jelle Niemantsverdriet
  • Registratie: Februari 2000
  • Laatst online: 11-09 15:49
Op woensdag 20 maart 2002 15:34 schreef skunkah het volgende:
heb ik een andere geholpen en me zelf ook metee doordat ik een ander hopelijk heb geholpen :)
Nu maar hopen dat 'ie het na een jaar nog 's leest :Z ;)

  • SWINX
  • Registratie: Juni 2001
  • Laatst online: 02-06 23:18
Op woensdag 20 maart 2002 23:28 schreef Jelle Niemantsverdriet het volgende:

[..]

Nu maar hopen dat 'ie het na een jaar nog 's leest :Z ;)
precies... beetje onnodig schop imo

Mannen komen van Mars Tweakers, vrouwen van Venus Bokt


  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op woensdag 20 maart 2002 15:34 schreef skunkah het volgende:

Zou het niet beter zijn?:

SELECT Count(distinct F.forumid) as totalforum,
Count(distinct P.postid) as totalpost, Distinct Count(distinct U.userid) as totaluserFROM forum as F, post as P, user as U

edit:

Heb het even getest dus COUNT(distinct VELDNAAM) dit werkt idd, heb ik een andere geholpen en me zelf ook metee doordat ik een ander hopelijk heb geholpen :)
Deze methode werkte nog niet in oudere MySQL versies (<3.23) dus vandaar dat ze dit toen niet gebruiken denk ik.
Pagina: 1