[SQL] Met count het aantal tellen zonder group by clause *

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

  • Cheater
  • Registratie: Januari 2001
  • Laatst online: 20-05 23:28
Ik wil graag topics + bijbehorende reacties uit een database halen en bij elke regel wil ik opnieuw de vermelding hoeveel reacties in die topic er waren.

De output zou dan zo moeten zijn:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
-----------------------------------------------------------
| newsid | head       | reactionid | nickname    | aantal |
-----------------------------------------------------------
| 1      | test1_bla  | NULL       | NULL        | 0      |
| 2      | test2_oeh  | 1          | piet        | 2      |
| 2      | test2_oeh  | 2          | kees        | 2      |
| 3      | test3_bla  | NULL       | NULL        | 0      |
| 4      | test4_bla  | 3          | kees        | 4      |
| 4      | test4_bla  | 4          | klaas       | 4      |
| 4      | test4_bla  | 5          | dirk        | 4      |
| 4      | test4_bla  | 6          | gerard      | 4      |
| 5      | test5_aha  | 7          | piet        | 1      |
-----------------------------------------------------------

De query die ik nu heb:
code:
1
2
3
4
5
6
7
8
SELECT clansite_news.newsid, 
       head, 
       reactionid, 
       nickname, 
       COUNT(reactionid) AS aantal
FROM clansite_news 
LEFT JOIN clansite_news_reactions ON clansite_news.newsid = clansite_news_reactions.newsid 
GROUP BY (reactionid)


Ik krijg nu (omdat de group by niet correct is om het aantal correct te tellen) dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
-----------------------------------------------------------
| newsid | head       | reactionid | nickname    | aantal |
-----------------------------------------------------------
| 1      | test1_bla  | NULL       | NULL        | 0      |
| 2      | test2_oeh  | 1          | piet        | 1      |
| 2      | test2_oeh  | 2          | kees        | 1      |
| 3      | test3_bla  | NULL       | NULL        | 0      |
| 4      | test4_bla  | 3          | kees        | 1      |
| 4      | test4_bla  | 4          | klaas       | 1      |
| 4      | test4_bla  | 5          | dirk        | 1      |
| 4      | test4_bla  | 6          | gerard      | 1      |
| 5      | test5_aha  | 7          | piet        | 1      |
-----------------------------------------------------------


Als ik zou grouperen op newsid krijg ik dit: (vermeld het maar om te voorkomen dat iemand dit als oplossing zou geven)
code:
1
2
3
4
5
6
7
8
9
-----------------------------------------------------------
| newsid | head       | reactionid | nickname    | aantal |
-----------------------------------------------------------
| 1      | test1_bla  | NULL       | NULL        | 0      |
| 2      | test2_oeh  | 2          | kees        | 2      |
| 3      | test3_bla  | NULL       | NULL        | 0      |
| 4      | test4_bla  | 5          | dirk        | 4      |
| 5      | test5_aha  | 7          | piet        | 1      |
-----------------------------------------------------------


Ik weet niet hoe ik dit voor elkaar moet krijgen :'( Iemand ?

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Het is sowieso niet mooi, maar je kunt dit bijvoorbeeld doen door de reactietabel een tweede maal te joinen (middels een alias) op topicid en te groupen op de reactieid uit de eerste reactietabel.

Who is John Galt?


Verwijderd

Cheater schreef op 28 juli 2004 @ 23:08:
Ik wil graag topics + bijbehorende reacties uit een database halen en bij elke regel wil ik opnieuw de vermelding hoeveel reacties in die topic er waren.
Ik herformuleer:
1. Ik wil graag topics en weten hoeveel reacties er in dat topic waren.
2. Daarnaast wil ik bij elk topic de bijbehorende reacties uit de database halen.
Cheater schreef op 28 juli 2004 @ 23:08:
Ik weet niet hoe ik dit voor elkaar moet krijgen :'( Iemand ?
Met de nieuwe formulering is het makkelijker om een passende query te fabriceren.

Maak een query voor #1 en een query voor #2. Deze kun je later met elkaar proberen te combineren.

[ Voor 9% gewijzigd door Verwijderd op 28-07-2004 23:33 ]


  • Cheater
  • Registratie: Januari 2001
  • Laatst online: 20-05 23:28
justmental schreef op 28 juli 2004 @ 23:17:
Het is sowieso niet mooi, maar je kunt dit bijvoorbeeld doen door de reactietabel een tweede maal te joinen (middels een alias) op topicid en te groupen op de reactieid uit de eerste reactietabel.
Ik ben aan het kijken op de mysql documentation site. Maar misschien kun je me een voorbeeldje geven hoe ik 2 keer kan joinen?

EDIT: Oh ik zie al een leuk voorbeeld:
SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id LEFT JOIN table3 ON table2.id=table3.id;
Verwijderd schreef op 28 juli 2004 @ 23:27:
Met de nieuwe formulering is het makkelijker om een passende query te fabriceren.

Maak een query voor #1 en een query voor #2. Deze kun je later met elkaar proberen te combineren.
Ik zat nog zo te bedenken of ik het erbij zou zetten maar: ik wil graag 1 query gebruiken (de reden laat ik even achterwege om daar discussies over te krijgen). Ik weet dat dit probleem heel makkelijk op te lossen is door 2 queries uit te voeren maar wil het toch in 1 query.

[ Voor 7% gewijzigd door Cheater op 28-07-2004 23:43 ]


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Cheater schreef op 28 juli 2004 @ 23:39:
Ik ben aan het kijken op de mysql documentation site. Maar misschien kun je me een voorbeeldje geven hoe ik 2 keer kan joinen?
code:
1
2
3
4
5
6
7
select a.iets
, b.nogiets
, b2.nogwat
from tabel1 a
, tabel2 b
, tabel2 b2
where ...

Who is John Galt?


Verwijderd

Cheater schreef op 28 juli 2004 @ 23:39:
[...]


Ik ben aan het kijken op de mysql documentation site. Maar misschien kun je me een voorbeeldje geven hoe ik 2 keer kan joinen?

[...]

Ik zat nog zo te bedenken of ik het erbij zou zetten maar: ik wil graag 1 query gebruiken (de reden laat ik even achterwege om daar discussies over te krijgen). Ik weet dat dit probleem heel makkelijk op te lossen is door 2 queries uit te voeren maar wil het toch in 1 query.
"... Deze kun je later met elkaar proberen te combineren."
mysql, dan vallen subquerys af...
De oplossing wordt waarschijnlijk een gigantisch carthesisch product van de twee tabellen.

[ Voor 8% gewijzigd door Verwijderd op 28-07-2004 23:47 ]


  • Cheater
  • Registratie: Januari 2001
  • Laatst online: 20-05 23:28
Dit geeft mij het uiteindelijke resultaat (zoals in de TopicStart beschreven staat):

code:
1
2
3
4
5
6
7
8
9
10
SELECT tbl1.newsid, 
       head, 
       tbl1.reactionid, 
       tbl1.nickname, 
       COUNT( tbl2.reactionid ) AS aantal
FROM clansite_news
LEFT JOIN clansite_news_reactions as tbl1 USING (newsid) 
LEFT JOIN clansite_news_reactions as tbl2 USING (newsid) 
GROUP  BY ( tbl2.reactionid ) 
ORDER BY tbl1.newsid


Heb ook maar USING gebruikt, ziet er wat netter uit.

Ik krijg geen supergroot cartetisch product hoor, aangezien ik een group by doe.
Omdat ik topictitel + message in 1 result wil krijg ik natuurlijk dubbele gegevens, maar de applicatie is daar juist op gebouwd.

Verwijderd

Umm... dit is toch gewoon incorrecte SQL? Je aggregeert op 1 kolom maar je groupt niet op de resterende kolommen (maar op maar eentje)?

Ik denk dat daar ook de oorspronkelijke fout lag.

  • Cheater
  • Registratie: Januari 2001
  • Laatst online: 20-05 23:28
De Queries in dit topic waren om te testen op m'n eigen database.
Het was bedoeld voor een andere database (met andere gegevens)
en dat is een MS ACCESS database.
Ik krijg deze alleen nu niet werkend.

M'n Query:
code:
1
2
3
4
5
6
7
8
9
SELECT tbl1.CallID, tbl1.PlacedBy as CallTextPlacedBy, tbl1.Text, tbl1.Antwoord, 
tbl1.DateTime, Calls.ID, Calls.PlacedBy as CallsPlacedBy, 
Calls.StartDateTime, Calls.Status, Calls.Subject, COUNT( tbl2.CallID ) as aantal 
FROM Calls 
LEFT JOIN CallText as tbl1 ON Calls.ID = CallText.CallID 
LEFT JOIN CallText as tbl2 ON Calls.ID = CallText.CallID 
GROUP BY ( tbl2.CallID )
WHERE Calls.PlacedByID = 36 
ORDER BY Calls.StartDateTime, tbl1.CallID, tbl1.DateTime


De foutmelding:
Syntaxfout (operator ontbreekt) in query-expressie Calls.ID = CallText.ID
LEFT JOIN CallText as tbl2 ON Calls.ID = CallText.CallID.

Iemand een idee hoe dit kan?

Verwijderd

Misschien een stomme vraag, maar waarom voer je twee keer precies dezelfde join uit maar noem je de tabellen anders?

Misschien dat Access dat wel niet pikt...

  • Cheater
  • Registratie: Januari 2001
  • Laatst online: 20-05 23:28
Zoals je in de TopicStart kunt lezen wil ik een aantal reacties
van het bepaalde topic weten. Ik wil ook een cartetisch product hebben van de topics + reacties.

Dit zou dan alleen kunnen door een 3 keer cartetisch product te maken en dan de laatste keer grouperen.

tbl1 x tbl2 x grouped(tbl3)

tbl2 = tbl3 vandaar de opnieuwe hernoeming in de JOIN

Verwijderd

Ik denk dat het beter is als je twee querys maakt (die je ook maar twee keer uitvoert).
Als het ware een master-detail. In de details query plaats je dan *alle* details-data van de master.
Bij het weergeven op het scherm loop je serieel door beide recordsets.

  • Cheater
  • Registratie: Januari 2001
  • Laatst online: 20-05 23:28
Om terug te komen op de ACCESS foutmelding:

Weet iemand hoe ik deze query werkend kan maken?
Er staat dat ik een operator mis, ik weet alleen niet waar.

  • Cheater
  • Registratie: Januari 2001
  • Laatst online: 20-05 23:28
*schop*

:'(

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Je where staat onder je group by |:(

Who is John Galt?

Pagina: 1