[MySQL] Meerdere GROUP BY's in één query

Pagina: 1
Acties:
  • 159 views sinds 30-01-2008
  • Reageer

  • dirkpostma
  • Registratie: Juni 2001
  • Laatst online: 10-05 16:53
Deze vraag was niet representatief voor mijn probleem; zie een paar berichten lager...
Is het met MySQL op een of andere manier mogelijk om meerder GROUP BY's te combineren in één query?

Bijvoorbeeld tabel:
code:
1
2
3
4
5
6
7
8
Tabel:
id     count1  count2
1     3  2 
1     2  1
1     5  4
2     2  6
2     2  4 
2     4  1

En nu wil ik alle id's waarbij de sum van count1 groter is dan de sum van count2, en dat met 1 query...

Ofwel met 1 query bepalen:

sum_count1 (id1) = 3+2+5 = 10
sum_count2 (id1) = 2+1+4 = 7
sum_count1 (id2) = 2+2+4 = 8
sum_count2 (id2) = 6+4+1 = 11

De query moet in dit geval enkel id2 retourneren.

Is dit mogelijk met 1 query? Mij lukt het helaas niet...

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 08-09 17:10
SELECT id, SUM(count1), SUM(count2) FROM tabel WHERE id = 2 GROUP BY id;

  • dirkpostma
  • Registratie: Juni 2001
  • Laatst online: 10-05 16:53
Op maandag 29 april 2002 17:23 schreef elviver het volgende:
SELECT id, SUM(count1), SUM(count2) FROM tabel WHERE id = 2 GROUP BY id;
Euhm, het is dus de bedoeling dat de query uitzoekt bij welke id's sum_count1 > sum_count2... Maar, ik heb al iets gevonden dat antwoord geeft op de vraag die ik heb gesteld, maar volgens mij is het voorbeeld dat ik heb gekozen verkeerd (niet representatief voor mijn probleem :))
code:
1
2
3
4
5
6
SELECT
  id,
  SUM(count1) as sum_count1,
  SUM(count2) as sum_count2
HAVING
  sum_count1 > sum_count2

Ik zal strakt nog eens proberen om de vraag opnieuw te stellen...

  • dirkpostma
  • Registratie: Juni 2001
  • Laatst online: 10-05 16:53
Hier mijn echte probleem (denk ik ;))
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
table logs1:
time  user_id  count1
 .. 3    1
 .. 3    1
 .. 4    1
 .. 3    1
 .. 3    1
 .. 4    1
 .. 4    1
 .. 3    1

table logs2:
time  user_id  count2
 .. 3    2
 .. 4    3
 .. 4    2
 .. 4    3
 .. 3    4
 .. 3    3

Nu wil ik in één query het verschil van het resultaat van 2 groups uitrekenen:

Ik wil weten:
* tabel logs1: SUM van count gegroepeerd op user_id
code:
1
2
3
  user_id   sum_count1
     3      5
     4      3

* tabel logs2: SUM van count gegroepeerd op user_id

user_id 3 -> 2+4+3 = 9
user_id 4 -> 3+2+3 = 8
code:
1
2
3
  user_id  sum_count2
     3      9
     4      8

* per user: het verschil van count1 en count2

user_id 3 -> 9-5 = 4
user_id 4 -> 8-3 = 5

* Uiteindelijk resultaat:
code:
1
2
3
  user_id  count_dif
     3     4
     4     5

Later moet er ook nog een restrictie op tijd gegeven kunnen worden, dus één counter of iets dergelijks is geen optie. Het moet aan de hand van deze logs. Zoals altijd: het liefst één query... Het zijn dus iets als twee GROUP BY's in één query... Kan dit met MySQL? Zo ja, hoe? Ik kom er niet uit...

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 08-09 17:10
code:
1
SELECT logs1.user_id, (SUM(logs2.count2) - SUM logs1.count1)) AS count_dif FROM logs1, logs2 GROUP BY logs1.user_id, logs2.user_id;

Ik hoop dat ie werkt, maar zeker weten doe ik het niet..

  • dirkpostma
  • Registratie: Juni 2001
  • Laatst online: 10-05 16:53
Dat werkt helaas niet :'( Door de eerste groupering werkt de tweede niet meer.

Ik ben al een paar uur bezig, ik vrees dat het echt niet kan... Met sub-selects zou het kunnen, maar dat kan MySQL nog niet.

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 08-09 17:10
Op maandag 29 april 2002 22:25 schreef dirkpostma het volgende:
Dat werkt helaas niet :'( Door de eerste groupering werkt de tweede niet meer.

Ik ben al een paar uur bezig, ik vrees dat het echt niet kan... Met sub-selects zou het kunnen, maar dat kan MySQL nog niet.
Sub-selects kunnen inderdaad niet.. Misschien kan het met een tablejoin.. Maar hoe die dingen werken ben ik nog niet uit.. Misschien een tutorial daarover lezen en dan weer proberen (en het mij vertellen har har >:))? Succes!

  • dirkpostma
  • Registratie: Juni 2001
  • Laatst online: 10-05 16:53
Heeft iemand misschien nog een verhelderende ingeving?

Verwijderd

Gaat volgens mij niet lukken.

Dus twee simpele queries voor de subresultaten, sorteren op user id, een dubbele loop, zorgen dat je rekening houdt met ID's die niet in beide tabellen voorkomen, en resultaten in een array pompen.

Enjoy :)

  • dirkpostma
  • Registratie: Juni 2001
  • Laatst online: 10-05 16:53
Bedankt voor het antwoord, bevestiging dat het niet gaat lukken :). Ik ben me behoorlijk aan het enjoyen :9~ met temporary tables waarin ik de tussenresultaten van alle nodige GROUP BY's opsla, en daarna die temporary tables gebruik in de uiteindelijke query.

Ik hoop alleen dat ik dan niet voor verassingen kom te staan, want ik heb nog NULL ervaring met temporary tables. Maar het zou OT gaan als ik dat hier zou vragen denk ik.. Misschien tot later, een andere

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Het kan wel.
Definieer eerst een view:
code:
1
2
3
4
5
6
7
8
CREATE VIEW userlogtotal AS
SELECT user_id 
    ,-count1 AS counttotal
FROM   log1
UNION
SELECT user_id
    ,count2 AS counttotal
FROM   log2

Op deze view kan je dan normaal grouperen, met:
code:
1
2
3
SELECT user_id
    ,SUM(counttotal)
FROM   userlogtotal

Wat mij verbaast is dat je twee log tabellen hebt. Hierdoor ontstaat dus ook het probleem. Ik ken de rest van je ontwerp niet, maar dat zou wel een het probleem kunnen zijn. Ik maak er dus eigenlijk weer eerst één tabel van.
Suc6

  • dirkpostma
  • Registratie: Juni 2001
  • Laatst online: 10-05 16:53
Op dinsdag 30 april 2002 20:50 schreef Goodielover het volgende:
Het kan wel. Definieer eerst een view:
code:
1
2
3
4
5
6
7
8
CREATE VIEW userlogtotal AS
SELECT user_id 
    ,-count1 AS counttotal
FROM   log1
UNION
SELECT user_id
    ,count2 AS counttotal
FROM   log2
Helaas, niet met MySQL. Ik heb even in de documentatie gekeken naar "VIEW", en het bleek dat MySQL (nog) geen views ondersteunt: http://www.mysql.com/doc/A/N/ANSI_diff_Views.html
Wat mij verbaast is dat je twee log tabellen hebt. Hierdoor ontstaat dus ook het probleem. Ik ken de rest van je ontwerp niet, maar dat zou wel een het probleem kunnen zijn. Ik maak er dus eigenlijk weer eerst één tabel van.
De twee logs zijn totaal verschillende soorten log's, zeg maar een log met appels en een log met peren die beide real-time zijn. Toch wil ik die met elkaar gaan vergelijken. Volgens mij kan dat wat ik wil echt niet anders. Maar ik heb inmiddels het een en ander aan de praat m.b.v. temporary tables die informatie bevatten over de afzonderlijke GROUP BY's.

In ieder geval toch allemaal bedankt, ik ben er vrijwel van overtuigd dat het (nog) niet kan :Y)
Pagina: 1