Bekijk Volledige Versie : [mysql] Join met lege rij'en weergeven?
Hoi!
Nu ik terug ben in NIWSS, heb ik ook gelijk een vraagje :)
Ik heb een db met 2 tables: vacatures en vakgebieden. Vakgebieden
hebben een naam en een id, en vacatures linken (met het veld
vakgebied) naar een vakgebied_id.
Nu wil ik een lijstje van vakgebieden maken. Dat doe ik met
select vakgebieden.*, count(vacatures.vacature_id) as aantal
from vacatures, vakgebieden
where vakgebieden.vakgebied_id=vacatures.vakgebied
GROUP BY vakgebieden.vakgebied_id
order by naam;
Dit geeft geen vakgebieden die geen vacatures hebben. Dat is voor
sommige dingen inderdaad erg praktisch. Maar ik wil ergens anders ook
deze wel tonen (waar de count dus 0 oplevert).
Hoe doe ik dit? Ik kan het natuurlijk oplossen door een simpele select
* from vakgebieden, en dan bij elke rij met een apparte query de
vacatures opvragen (met een simpele select count(*) from vacatures
where vakgebied=$id''). Maar dat vind ik een minder mooie oplossing.
Kan dit ook in 1 query?
Thnx!
PanMan.
Maarten Wierda
05/04/05, 00:05
PanMan wrote:
> Hoi!
Hoi,
> Nu ik terug ben in NIWSS, heb ik ook gelijk een
> vraagje :)
Dat kan.
> Ik heb een db met 2 tables: vacatures en
> vakgebieden. Vakgebieden hebben een naam en een id, en
> vacatures linken (met het veld vakgebied) naar een
> vakgebied_id. Nu wil ik een lijstje van vakgebieden
> maken. Dat doe ik met
<snip query>
> Dit geeft geen vakgebieden die geen vacatures hebben. Dat
> is voor sommige dingen inderdaad erg praktisch. Maar ik
> wil ergens anders ook deze wel tonen (waar de count dus 0
> oplevert). Hoe doe ik dit?
Dat kan met 'left join'. Als ik het goed heb selecteer je
met 'left join' alle resultaten uit de 'eerste' tabel /en/
alle resultaten uit de 'tweede' tabel, ook als deze NULL
opleveren.
Probeer eens +-
SELECT
v.*,
g.*
FROM
vacatures AS v
LEFT JOIN
vakgebieden AS g
ON
v.id = g.id
(niet getest)
--
Cheers,
Maarten Wierda
"Shit happens. Then you wipe."
Rene Pijlman
05/04/05, 00:35
PanMan:
>Hoi!
Hoi2u2 PanMan!
>select vakgebieden.*, count(vacatures.vacature_id) as aantal
>from vacatures, vakgebieden
>where vakgebieden.vakgebied_id=vacatures.vakgebied
>GROUP BY vakgebieden.vakgebied_id
>order by naam;
>
>Dit geeft geen vakgebieden die geen vacatures hebben. Dat is voor
>sommige dingen inderdaad erg praktisch. Maar ik wil ergens anders ook
>deze wel tonen (waar de count dus 0 oplevert).
>Hoe doe ik dit?
Ik vertik het om uit te zoeken of MySQL het ondersteunt, maar bij
volwaardige databases zoals PostgreSQL doe je dat met een left outer join:
select ...
from vacatures left outer join vakgebieden
on vakgebieden.id = vacatures.vakgebied
where ...
--
René Pijlman
Wat wil jij leren? http://www.leren.nl
On Mon, 04 Apr 2005 23:56:49 +0200, Maarten Wierda
<moart3nAT@chelloDOT.nl> wrote:
>PanMan wrote:
>
>> Ik heb een db met 2 tables: vacatures en
>> vakgebieden. Vakgebieden hebben een naam en een id, en
>> vacatures linken (met het veld vakgebied) naar een
>> vakgebied_id. Nu wil ik een lijstje van vakgebieden
>> maken. Dat doe ik met
>
><snip query>
>
>> Dit geeft geen vakgebieden die geen vacatures hebben. Dat
>> is voor sommige dingen inderdaad erg praktisch. Maar ik
>> wil ergens anders ook deze wel tonen (waar de count dus 0
>> oplevert). Hoe doe ik dit?
>
>Dat kan met 'left join'. Als ik het goed heb selecteer je
>met 'left join' alle resultaten uit de 'eerste' tabel /en/
>alle resultaten uit de 'tweede' tabel, ook als deze NULL
>opleveren.
>
>Probeer eens +-
>
>SELECT
> v.*,
> g.*
>FROM
> vacatures AS v
>LEFT JOIN
> vakgebieden AS g
>ON
> v.id = g.id
>
>(niet getest)
Hrmz, ik heb het wel ff getest. Count toegevoegd, maar dan werkt het
niet...
SELECT
count(v.vacature_id),
g.*
FROM
vacatures AS v
LEFT JOIN
vakgebieden AS g
ON
v.vakgebied = g.vakgebied_id
GROUP BY g.vakgebied_id
Ik krijg dus, net zoals met mijn eigen query, alleen rij'en waar de
count >0 is.
Dat gebruik van aliassen is wel nice.
Ik zal er morgen ff verder in duiken, die left join.
Groeten,
PanMan.
Rene Pijlman
05/04/05, 00:45
PanMan:
>>LEFT JOIN
[...]
>Ik krijg dus, net zoals met mijn eigen query, alleen rij'en waar de
>count >0 is.
Maarten en jij onderschatten het belang van het keyword 'OUTER'. Dat zal
er wel mee te maken hebben dat de MySQL-documentatie er geen woord aan
wijdt, i.i.g. niet op http://dev.mysql.com/doc/mysql/en/join.html waarnaar
ik ondanks stevige weerzin toch even gekeken heb.
Voeg het toch maar eens toe ("left outer join"), wie weet wordt dit door
MySQL daadwerkelijk ondersteund.
--
René Pijlman
Wat wil jij leren? http://www.leren.nl
Maarten Wierda
05/04/05, 14:05
PanMan wrote:
>>Dat kan met 'left join'. Als ik het goed heb selecteer je
>>met 'left join' alle resultaten uit de 'eerste' tabel /en/
>>alle resultaten uit de 'tweede' tabel, ook als deze NULL
>>opleveren.
>>
>>Probeer eens +-
<snip query>
> Hrmz, ik heb het wel ff getest. Count toegevoegd, maar dan werkt het
> niet...
Opes, ik zie nu pas dat je ook een heel andere vraag stelde. Ik zat te
denken aan een lijstje met vacatures en eventueel het bijbehorende
vakgebied. Onderstaande query doet wel wat je wil:
SELECT
g.*,
v.*,
FROM
vakgebied AS g
LEFT JOIN
vacature AS v
ON
g.id = v.vakgebiedid
Je kunt natuurlijk ook COUNT toevoegen maar dan krijg je +- onderstaande
resultaat:
id naam id vakgebiedid naam COUNT(v.id)
3 gebied3 NULL NULL NULL 0
1 gebied1 1 1 vac1 1
2 gebied2 2 2 vac2 1
1 gebied1 4 1 vac4 1
(wel getest)
--
Cheers,
Maarten Wierda
"Shit happens. Then you wipe."
Maarten Wierda
05/04/05, 14:15
Rene Pijlman wrote:
>>>LEFT JOIN
>
> [...]
>
>>Ik krijg dus, net zoals met mijn eigen query, alleen rij'en waar de
>>count >0 is.
>
> Maarten en jij onderschatten het belang van het keyword 'OUTER'.
Nee hoor, ik ben tot nu toe altijd in de veronderstelling geweest dat je
INNER en OUTER JOINs hebt en dat OUTER JOINs bestan uit LEFT en RIGHT
JOINs. Maar wees gerust, ik ben dan ook geen database-expert.
> Voeg het toch maar eens toe ("left outer join"), wie weet wordt dit door
> MySQL daadwerkelijk ondersteund.
Geeft hier hetzelfde resultaat als wanneer ik OUTER weglaat (getest met
query uit vorige post).
--
Cheers,
Maarten Wierda
"Shit happens. Then you wipe."
On Tue, 05 Apr 2005 14:05:02 +0200, Maarten Wierda
<moart3nAT@chelloDOT.nl> wrote:
>PanMan wrote:
>
>Opes, ik zie nu pas dat je ook een heel andere vraag stelde. Ik zat te
>denken aan een lijstje met vacatures en eventueel het bijbehorende
>vakgebied. Onderstaande query doet wel wat je wil:
>
[snip]
>
>Je kunt natuurlijk ook COUNT toevoegen maar dan krijg je +- onderstaande
>resultaat:
[snip]
>(wel getest)
Woei!
Na nog wat geklooi (stond een komma verkeerd, en er waren nog wat rare
fouten, maar ik heb het nu inderdaad werkend!
Heb nu dit:
SELECT
g.*,
count(v.vacature_id)
FROM
vakgebieden AS g
LEFT JOIN
vacatures AS v
ON g.vakgebied_id = v.vakgebied
GROUP BY g.vakgebied_id
Dat geeft een resultaat alla:
+--------------+-----------------------+----------------------+
| vakgebied_id | naam | count(v.vacature_id) |
+--------------+-----------------------+----------------------+
| 1 | ICT & Dienstverlening | 2 |
| 3 | horeca | 3 |
| 4 | Testgebied | 1 |
| 6 | Leeggebied | 0 |
+--------------+-----------------------+----------------------+
Thnx!
Groeten,
PanMan.
(die laatst een oplossing voor een probleem in z'n eigen post uit '99
in het google archief vondt, en dus opgeloste problemen vaker gaat
posten :)).