PDA

Bekijk Volledige Versie : [SQL] Join; count = 0 teruggeven



Rick
20/06/04, 22:45
Ik zit er al een tijdje op te puzzelen, maar het wil niet vlotten. Het
gaat om twee tables uit een mysql db. De ene table is users en de andere
is posts (om het voorbeeld maar tastbaar te maken :)). Nu wil ik tellen
(via een COUNT()) hoe vaak er een post van een user voorkomt in de
posttable. Echter als een user nog geen post heeft geplaatst, wil ik dat
deze wel terugkomt in mijn result, maar dan met het totaal 0. Momenteel
lukt het mij alleen om een result terug te krijgen voor de users die
gepost hebben. Iemand enig idee hoe ik deze query moet opbouwen?

Rene Pijlman
21/06/04, 00:45
Rick:
>Ik zit er al een tijdje op te puzzelen, maar het wil niet vlotten. Het
>gaat om twee tables uit een mysql db. De ene table is users en de andere
>is posts (om het voorbeeld maar tastbaar te maken :)). Nu wil ik tellen
>(via een COUNT()) hoe vaak er een post van een user voorkomt in de
>posttable. Echter als een user nog geen post heeft geplaatst, wil ik dat
>deze wel terugkomt in mijn result, maar dan met het totaal 0. Momenteel
>lukt het mij alleen om een result terug te krijgen voor de users die
>gepost hebben. Iemand enig idee hoe ik deze query moet opbouwen?

Ff uit mijn hoofd, met een echte database zou ik een outer join maken,
zodat de users zonder posts wel in het resultaat verschijnen, maar met
null's in de post-kolommen. Dan zou het met een group by op de user id en
een count op een post-kolom moeten lukken.

Maar iets zegt me dat Mysql op het gebied van de (outer) joins, null's,
group by's en counts zoveel tekortkomingen heeft dat het feest niet
doorgaat.

--
René Pijlman

Wat wil jij leren? http://www.leren.nl

Ronald Klip
21/06/04, 09:45
Rene Pijlman schreef:
> Rick:
> >Ik zit er al een tijdje op te puzzelen, maar het wil niet vlotten. Het
> >gaat om twee tables uit een mysql db. De ene table is users en de andere
> >is posts (om het voorbeeld maar tastbaar te maken :)). Nu wil ik tellen
> >(via een COUNT()) hoe vaak er een post van een user voorkomt in de
> >posttable. Echter als een user nog geen post heeft geplaatst, wil ik dat
> >deze wel terugkomt in mijn result, maar dan met het totaal 0. Momenteel
> >lukt het mij alleen om een result terug te krijgen voor de users die
> >gepost hebben. Iemand enig idee hoe ik deze query moet opbouwen?
>
> Ff uit mijn hoofd, met een echte database zou ik een outer join maken,
> zodat de users zonder posts wel in het resultaat verschijnen, maar met
> null's in de post-kolommen. Dan zou het met een group by op de user id en
> een count op een post-kolom moeten lukken.
>
> Maar iets zegt me dat Mysql op het gebied van de (outer) joins, null's,
> group by's en counts zoveel tekortkomingen heeft dat het feest niet
> doorgaat.

Dat valt reuze mee.
OP, je vraag wordt beantwoord in de manual:
http://dev.mysql.com/doc/mysql/en/JOIN.html

--
groet, Ronald

bram
23/06/04, 20:25
Rick wrote:
> Ik zit er al een tijdje op te puzzelen, maar het wil niet vlotten. Het
> gaat om twee tables uit een mysql db. De ene table is users en de andere
> is posts (om het voorbeeld maar tastbaar te maken :)). Nu wil ik tellen
> (via een COUNT()) hoe vaak er een post van een user voorkomt in de
> posttable. Echter als een user nog geen post heeft geplaatst, wil ik dat
> deze wel terugkomt in mijn result, maar dan met het totaal 0. Momenteel
> lukt het mij alleen om een result terug te krijgen voor de users die
> gepost hebben. Iemand enig idee hoe ik deze query moet opbouwen?

SELECT username, IF(ISNULL(count(p.userid)),0,count(p.posts)) FROM
usertable u LEFT JOIN posttable p ON u.userid=p.userid

zoiets in ieder geval. Bij een normale join worden er als er geen
resultaten zijn, dat niet getoond. Bij een left join worden er NULLS
toegevoegd als er geen resultaten zijn die voldoen.

SYNTAX: Table1 LEFT JOIN Table2 ON expression

IF(ISNULL(count(p.userid)),0,count(p.posts)) dit maakt van NULLS nullen.

Michiel de Roo
24/06/04, 01:55
bram wrote:
>
>
> Rick wrote:
>
>> Ik zit er al een tijdje op te puzzelen, maar het wil niet vlotten. Het
>> gaat om twee tables uit een mysql db. De ene table is users en de
>> andere is posts (om het voorbeeld maar tastbaar te maken :)). Nu wil
>> ik tellen (via een COUNT()) hoe vaak er een post van een user voorkomt
>> in de posttable. Echter als een user nog geen post heeft geplaatst,
>> wil ik dat deze wel terugkomt in mijn result, maar dan met het totaal
>> 0. Momenteel lukt het mij alleen om een result terug te krijgen voor
>> de users die gepost hebben. Iemand enig idee hoe ik deze query moet
>> opbouwen?
>
>
> SELECT username, IF(ISNULL(count(p.userid)),0,count(p.posts)) FROM
> usertable u LEFT JOIN posttable p ON u.userid=p.userid
>
> zoiets in ieder geval. Bij een normale join worden er als er geen
> resultaten zijn, dat niet getoond. Bij een left join worden er NULLS
> toegevoegd als er geen resultaten zijn die voldoen.
>
> SYNTAX: Table1 LEFT JOIN Table2 ON expression
>
> IF(ISNULL(count(p.userid)),0,count(p.posts)) dit maakt van NULLS nullen.
>

Prachtige query !

Maar nog beter is 'IF(ISNULL(count(p.userid)),0,count(p.posts)) as cnt' of
zoiets, anders is het moeilijk uitlezen :-)