Avatar billede Slettet bruger
17. november 2005 - 10:55 Der er 9 kommentarer og
1 løsning

JOIN og COUNT

Hejsa

Jeg håber nogen kan hjælpe mig med et problem jeg har med en SQL-query. (MySQL)
Jeg har nogle tabeller i databasen (nyheder, afstemninger, billeder osv) som alle indeholder en reference til et bruger ID.
Hvordan kan jeg med en enkelt query udtrække hvor mange nyherder, afstemninger og billeder hver enkelt bruger har oprettet?

Tabellerne kunne se sådan ud:

news:
id | userId

poll:
id | userId

image:
id | userId

Jeg har prøvet lidt forskelligt, men jeg kan ikke finde ud af det..

På forhånd tak

Mvh. Andreas
Avatar billede arne_v Ekspert
17. november 2005 - 11:52 #1
(SELECT COUNT(*) FROM news WHERE userId=X)
UNION
(SELECT COUNT(*) FROM poll WHERE userId=X)
UNION
(SELECT COUNT(*) FROM image WHERE userId=X)

da jeg ikke tror at disse virker:

SELECT (SELECT COUNT(*) FROM news WHERE userId=X)+(SELECT COUNT(*) FROM poll WHERE userId=X)+(SELECT COUNT(*) FROM image WHERE userId=X)

SELECT COUNT(*) FROM
(SELECT id FROM news WHERE userId=X)
UNION
(SELECT id FROM poll WHERE userId=X)
UNION
(SELECT id FROM image WHERE userId=X)
Avatar billede Slettet bruger
17. november 2005 - 12:04 #2
Tak for svaret, men det var ikke det som var meningen..
Jeg vil have et resultat som ser sådan ud:
userId | newsCount | pollCount | imageCount
1 | 1 | 0 | 0
2 | 6 | 2 | 7
3 | 0 | 0 | 22
osv
Avatar billede arne_v Ekspert
17. november 2005 - 12:13 #3
hvad med

SELECT * FROM
(SELECT userId,COUNT(*) AS nnews FROM news GROUP BY userID) cnews,
(SELECT userId,COUNT(*) AS npoll FROM poll GROUP BY userID) cpoll,
(SELECT userId,COUNT(*) AS nimage FROM image GROUP BY userID) cimage
WHERE cnews.userId=cpoll.userId AND cpoll.userId=cimage.userId
Avatar billede Slettet bruger
17. november 2005 - 12:33 #4
Den der var faktisk en af de ting jeg havde prøvet.
Men på den måde får man jo kun brugere som oprettet minumum 1 af hver 'ting'.. (Grundet at JOIN'en..)
Avatar billede arne_v Ekspert
17. november 2005 - 12:55 #5
kan du så ikke lave en rigth join med en select distinct for hver af de 3 for at
få 0'erne med ?
Avatar billede Slettet bruger
17. november 2005 - 13:02 #6
Vil du give et eksempel på det? Jeg er ikke helt med på hvad skal gøre.. Hvad er RIGHT JOIN?
Avatar billede arne_v Ekspert
17. november 2005 - 13:39 #7
SELECT * FROM

(SELECT * FROM (SELECT userId,COUNT(*) AS nnews FROM news GROUP BY userID) cnews
RIGTH JOIN ((SELECT userId FROM news) UNION (SELECT userId FROM poll) UNION (SELECT userId FROM image)) all ON cnews.userId=all.userId) cnews2,

(SELECT * FROM (SELECT userId,COUNT(*) AS npoll FROM poll GROUP BY userID) cpoll
RIGTH JOIN ((SELECT userId FROM news) UNION (SELECT userId FROM poll) UNION (SELECT userId FROM image)) all ON cpoll.userId=all.userId) cpoll2,

(SELECT * FROM (SELECT userId,COUNT(*) AS nimage FROM image GROUP BY userID) cimage
RIGTH JOIN ((SELECT userId FROM news) UNION (SELECT userId FROM poll) UNION (SELECT userId FROM image)) all ON cimage.userId=all.userId) cimage2

WHERE cnews2.userId=cpoll2.userId AND cpoll2.userId=cimage2.userId
Avatar billede arne_v Ekspert
17. november 2005 - 13:39 #8
og det er absolut utestet !
Avatar billede Slettet bruger
17. november 2005 - 14:17 #9
Efter lidt rettelser er det der perfekt :)
Smid et svar, så får du point.
Mange tak for hjælpen!
Avatar billede arne_v Ekspert
17. november 2005 - 15:05 #10
ok
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
Computerworld tilbyder specialiserede kurser i database-management

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