[MySQL] count() en UNION werken niet samen?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hey allemaal,

ik wil op mijn site een klein overzichtje geven van het aantal geregistreerde leden per tijdsvak.
bv : SELECT COUNT(*) AS aantalleden1h FROM users WHERE registerDate >= DATE_SUB(NOW(), INTERVAL 1 HOUR)

nu wil ik eigenlijk in dezelfde query ook bijvoorbeeld het aantal leden van de afgelopen maand,week,etc. Dus ik dacht bv: SELECT COUNT(*) AS aantalleden7d FROM users WHERE registerDate >= DATE_SUB(NOW(), INTERVAL 7 DAY)

Nu heb ik geprobeerd alles in 1 query te zetten met gebruik van UNION, maar dat blijkt dus niet te werken. Ik krijg om de een of andere reden maar 1 waarde terug steeds. Ofwel, het deel COUNT(*) AS lijkt helemaal niet gebruikt te worden. wat doe ik fout?

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Laat de UNION query maar zien. :)

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
"SELECT COUNT(*) AS aantalleden1h FROM users WHERE registerDate >= DATE_SUB(NOW(), INTERVAL 1 HOUR)
UNION
SELECT COUNT(*) AS aantalleden7d FROM users WHERE registerDate >= DATE_SUB(NOW(), INTERVAL 7 DAY)"

Acties:
  • 0 Henk 'm!

  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 15-07 15:35

leuk_he

1. Controleer de kabel!

Als uit beide kanten van de union hetzelfde komt laat hij er maar 1 zien.

Union:

Afbeeldingslocatie: http://www.gplivna.eu/papers/sql_set_operators_files/04_sql_union.gif

union all <-- die wil jij

Afbeeldingslocatie: http://www.gplivna.eu/papers/sql_set_operators_files/05_sql_union_all.gif


of je selecteerd

SELECT 'hour',COUNT(*) AS aantalleden1h FROM users WHERE registerDate >= DATE_SUB(NOW(), INTERVAL 1 HOUR)
UNION
SELECT 'week',COUNT(*) AS aantalleden7d FROM users WHERE registerDate >= DATE_SUB(NOW(), INTERVAL 7 DAY)"

[ Voor 29% gewijzigd door leuk_he op 22-05-2009 14:31 ]

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.


Acties:
  • 0 Henk 'm!

  • roeleboel
  • Registratie: Maart 2006
  • Niet online

roeleboel

en zijn beestenboel

is het idee achter 'union' niet dat er dezelfde kolomnamen gebruikt worden?
nu weet ik dat mysql wat 'losser' omgaat met de sql-standaard, maar op een mssql moet ik toch echt dezelfde kolomnamen gebruiken om alle gegevens getoond te krijgen.
Met andere woorden: maak van 'aantalleden7d' eens 'aantalleden1h' en kijk eens of dat iets geeft?

Edit: en maak van 'hour' en 'week' eens iets à la 'hour' as duration & 'week' as duration
(puur uit het geheugen hier, vergeef me dus enige foute syntax, maar het idee zou duidelijk moeten zijn)
(dit dus als je de reactie van hierboven gaat gebruiken)

[ Voor 27% gewijzigd door roeleboel op 22-05-2009 14:37 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ok, UNION ALL had ik al geprobeerd maar deed ook niks. En ook jouw 2e voorstel werkt niet, krijg nog steeds maar 1 waarde terug. Ik wil gewoon aantalleden1h en aantalleden7d kunnen outputten...

Acties:
  • 0 Henk 'm!

  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 15-07 15:35

leuk_he

1. Controleer de kabel!

roeleboel schreef op vrijdag 22 mei 2009 @ 14:34:
is het idee achter 'union' niet dat er dezelfde kolomnamen gebruikt worden?
Nee hoor.

http://dev.mysql.com/doc/refman/5.0/en/union.html
The column names from the first SELECT statement are used as the column names for the results returned. Selected columns listed in corresponding positions of each SELECT statement should have the same data type.
Namen mogen anders zijn, type niet.

verder
The default behavior for UNION is that duplicate rows are removed from the result.
Nou snap ik het ook effe niet meer. wat bedoel je met waarde? 1 rij of 1 kolom?

[ Voor 5% gewijzigd door leuk_he op 22-05-2009 14:41 ]

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Verwijderd schreef op vrijdag 22 mei 2009 @ 14:15:
"SELECT COUNT(*) AS aantalleden1h FROM users WHERE registerDate >= DATE_SUB(NOW(), INTERVAL 1 HOUR)
UNION
SELECT COUNT(*) AS aantalleden7d FROM users WHERE registerDate >= DATE_SUB(NOW(), INTERVAL 7 DAY)"
Je krijgt maar 1 kolom, maar wel 2 rijen. ;) En UNION is idd default DISTINCT. Ik hou altijd van expliciet, dus gebruik altijd expliciet UNION ALL of UNION DISTINCT.
leuk_he schreef op vrijdag 22 mei 2009 @ 14:38:
Nou snap ik het ook effe niet meer.
Klopt, maar dat slaat hier dus op de waarde van count(*) !

[ Voor 17% gewijzigd door Voutloos op 22-05-2009 14:41 ]

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ok, ik moet duidelijker zijn denk ik. Ik heb 1 tabel waarbij bij iedere user een registerDate staat. Nu wil ik dus met een query een verschil gaan maken in de data die in registerDate staan.

B.v. Nieuwe leden:
vandaag : 5
afgelopen week: 55
etc.

Maar als ik dit probeer met de union zoals ik hiervoor plaatste krijg ik maar 1 waarde (van een count(*) terug steeds. Ik zou namelijk verwachten dat ik na de query de beschikking had over de variabelen aantalleden1h en aantalleden7d. Maar dat is dus niet. Ik heb om een of andere reden alleen aantalleden1h ter beschikking, maar die heeft de waarde van aantalleden7d ??!?!

Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 14:57

Dido

heforshe

Geef eens precies aan wat je terugkrijgt? Want ik denk (en ik ben niet de enige) dat je wel eens exact zou kunnen terugkrijgen wat je terug zou moeten krijgen ;)

Met een union van twee queries met 1 veld krijg je een resultaat met 1 veld terug. Je plakt je resultaten zeg maar "onder elkaar", niet naast elkaar. Ik vermoed dat jij ze wel naast elkaar verwacht.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Naam Aantal
Piet  12

UNION

Naam Prijs
Klaas  23

GEEFT:

Naam Aantal
Piet   12
Klaas  23

EN NIET

Naam         Aantal Prijs
Piet/Klaas   12       23

In dit voorbeeld zie je ook meteen waarom de kolommen niet naast elkaar staan ;)

[ Voor 26% gewijzigd door Dido op 22-05-2009 15:04 ]

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
arghhhhhhhhhhhhh, stupid me!
Je hebt helemaal gelijk Dido, wat een ei ben ik ook :S

Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 14:57

Dido

heforshe

Een ei hoort erbij, zullen we maar zeggen :+

Wat betekent mijn avatar?

Pagina: 1