Avatar billede mortency Nybegynder
17. marts 2005 - 17:56 Der er 6 kommentarer og
2 løsninger

SQL med Count blir feil

Jeg har 3 tabeller

Forum
-ForumID
-ForumNavn
-ForumBeskrivelse
Temaer
-TemaID
-Tema_ForumID
-TemaNavn
Innlegg
-InnleggID
-Innlegg_TemaID
-InnleggTreff

Hvordan kan jeg få ut antall temaer,antall innlegg og antall treff under et forum? Er det noen felter jeg har glemt, eller burde ha med?

Jeg har laget to spørringer den siste med join virker hvis jeg tar med DISTINCt i countene men da blir det jo feil hvis antalltreff er lik en annen verdi.

Alle countene virker hvis jeg kjører en og en av gangen men ikke sammen.

SELECT F.ForumID,F.ForumNavn,F.ForumBeskrivelse,F.ForumOpprettet,Count(I.InnleggTreff) AS AntallTreff,Count(T.TemaID) AS AntallTemaer,Count(I.InnleggID) AS AntallInnlegg
FROM
Forum_Forumer AS F,Forum_Temaer AS T,Forum_Innlegg AS I
WHERE
F.ForumID=T.Tema_ForumID AND
F.ForumID=I.Innlegg_ForumID
GROUP BY ForumID,ForumNavn,ForumBeskrivelse,ForumOpprettet,ForumPrioritet,InnleggTreff ORDER BY ForumPrioritet ASC

-------------------------------
SELECT
F.ForumID,F.ForumNavn,F.ForumBeskrivelse,F.ForumOpprettet,
SUM(DISTINCT I.InnleggTreff) AS AntallTreff,
COUNT(DISTINCT T.TemaID) AS AntallTemaer,
COUNT(DISTINCT I.InnleggID) AS AntallInnlegg
FROM
Forum_Forumer AS F
LEFT JOIN Forum_Temaer AS T ON F.ForumID=T.Tema_ForumID
LEFT JOIN Forum_Innlegg AS I ON I.Innlegg_ForumID=F.ForumID
GROUP BY F.ForumID,F.ForumNavn,F.ForumBeskrivelse,F.ForumOpprettet
Avatar billede eagleeye Praktikant
17. marts 2005 - 18:18 #1
Når tabellerne bliver joinet kommer der flere kolonnener end der er pga man sætte flere tabeller ved siden af hinanden.

En måde kunne være at lave nogle sub select for hver: AntallTreff, AntallTemaer og AntallInnlegg. Eks:

SELECT F.ForumID,F.ForumNavn,F.ForumBeskrivelse,F.ForumOpprettet,
(select SUM( I.InnleggTreff ) from Innlegg AS I inner join Forum on I.Innlegg_ForumID=Forum.ForumID where i.innlegg_forumid = f.forumid) as AntallTreff,
(select count(T.TemaID) from Temaer AS T inner join forum on T.Tema_ForumID = forum.forumID where T.Tema_ForumID = F.forumid) as AntallTemaer,
(select count(I.InnleggID) from Innlegg AS I inner join forum on I.Innlegg_ForumID = forum.forumID where I.Innlegg_ForumID = F.forumid) as AntallInnlegg
FROM Forum AS F;
Avatar billede kjulius Novice
17. marts 2005 - 21:42 #2
Hmm., med den tabelopbygning burde det da bare kunne gøres sådan her, eller hvad?

SELECT
F.ForumID,F.ForumNavn,F.ForumBeskrivelse,F.ForumOpprettet,
COUNT(*) AS AntallTreff,
COUNT(DISTINCT T.TemaID) AS AntallTemaer,
COUNT(DISTINCT I.InnleggID) AS AntallInnlegg
FROM
Forum_Forumer AS F
LEFT JOIN Forum_Temaer AS T ON F.ForumID=T.Tema_ForumID
LEFT JOIN Forum_Innlegg AS I ON I.Innlegg_ForumID=F.ForumID
GROUP BY F.ForumID,F.ForumNavn,F.ForumBeskrivelse,F.ForumOpprettet
Avatar billede kjulius Novice
17. marts 2005 - 21:48 #3
Ooops, jeg blev lidt vildledt af dit oprindelige indlæg. Sammenknytningskriteriet på din anden LEFT JOIN var vist ikke helt rigtig. Den bør være sådan her:

SELECT
F.ForumID,F.ForumNavn,F.ForumBeskrivelse,F.ForumOpprettet,
COUNT(*) AS AntallTreff,
COUNT(DISTINCT T.TemaID) AS AntallTemaer,
COUNT(DISTINCT I.InnleggID) AS AntallInnlegg
FROM
Forum_Forumer AS F
LEFT JOIN Forum_Temaer AS T ON F.ForumID=T.Tema_ForumID
LEFT JOIN Forum_Innlegg AS I ON I.Innlegg_TemaID=T.TemaID
GROUP BY F.ForumID,F.ForumNavn,F.ForumBeskrivelse,F.ForumOpprettet
Avatar billede kjulius Novice
17. marts 2005 - 21:59 #4
Hmm, jeg har vist stadig ikke helt forstået det, for i ovenstående vil AntallTreff sandsynligvis være lig AntallInnlegg.

Hvad er forskellen på AntallTreff og AntallInnlegg? Eller rettere - hvad indeholder InnleggTreff, siden du forsøger at opsummere dem?
Avatar billede mortency Nybegynder
18. marts 2005 - 09:40 #5
//Eagleeye du kom med svar først men jeg synes kjulius query virker best.

Takk for hjelpen begge to jeg deler pointene mellom dere.

Queryen ser slik ut nå:
---------------------------------------------------------
SELECT
F.ForumID,F.ForumNavn,F.ForumBeskrivelse,
T.TemaID,T.TemaNavn,
SUM(I.InnleggTreff) AS AntallTreff,
COUNT(DISTINCT T.TemaID) AS AntallTemaer,
COUNT(DISTINCT I.InnleggID) AS AntallInnlegg
FROM
Forum_Forumer AS F
LEFT JOIN Forum_Temaer AS T ON F.ForumID=T.Tema_ForumID
LEFT JOIN Forum_Innlegg AS I ON I.Innlegg_TemaID=T.TemaID
GROUP BY F.ForumID,F.ForumNavn,F.ForumBeskrivelse,
T.TemaID,T.TemaNavn
ORDER BY F.ForumNavn,T.TemaNavn
---------------------------------------------------------

Hvordan kan jeg legge inn følgende? Noen av dere som vet dette?

CASE WHEN AntallTreff IS Null Then 0 END AS AntallTreff
Avatar billede eagleeye Praktikant
18. marts 2005 - 20:06 #6
det kommer an på hvilken database du bruger. men jeg antager du bruger mysql ud fra det du skriver.

det kan gøres i stil med: COALESCE(COUNT(*),0) as AntallTreff

Eller som du selv skriver: (CASE WHEN isNull(count(*)) THEN count(*) ELSE 0 END;) as AntallTreff
Avatar billede kjulius Novice
19. marts 2005 - 01:57 #7
Okay, bare glad for at kunne hjælpe...
Avatar billede kjulius Novice
19. marts 2005 - 02:10 #8
Som eagleeye også skriver, så kan du bruge både en CASE konstruktion og en COALESCE:

Standard SQL med COALESCE:

SUM(COALESCE(I.InnleggTreff, 0)) AS AntallTreff,


eller standard SQL med CASE:

SUM(CASE WHEN I.InnleggTreff IS NULL THEN 0 ELSE I.InnleggTreff END) AS AntallTreff,


eller Transact SQL med ISNULL:

SUM(ISNULL(I.InnleggTreff, 0)) AS AntallTreff,


Alle veje fører som bekendt til Rom...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester