Toon posts:

[MySql] Join, slaat lege velden over

Pagina: 1
Acties:

Verwijderd

Topicstarter
Heey,

ik heb de volgende situatie:
tabel Groepen:
id key groep
1    A    Alpha
2    A    Beta
3    A    Treta
4    B    Alpha

tabel Leden:
id key groep infoA infoB etc
1 A      Alpha     x        y
2 A      Alpha     x        y
3 A      Treta      x        y
4 A                   x        y

daar gooi ik de volgende query op los:
SELECT Groepen.groep AS groep, COUNT(Leden.id) AS aantal FROM `Groepen` LEFT JOIN Leden ON (Leden.groep = Groepen.groep) WHERE Groepen.key = "A" GROUP BY Groepen.groep

hier komt dus mooi uit:
groep aantal
Alpha     2
Beta      0
Treta      1

Hij telt alleen niet de laatste lege groep (id=4) uit 'Leden' mee. Logisch volgens deze query. Hoe kan ik ervoor zorgen dat deze lege groep wel wordt meegeteld? Er is niet altijd een lege groep..

zoals het niet kan:
- een lege groep toevoegen in de tabel 'Groepen'
- de query omdraaien zodat de Join andersom werkt (in deze situatie zal Beta niet worden meegeteld omdat deze niet in de tabel 'Leden' aanwezig is.

Wat ik al geprobeer heb:
- Na 4 jaar Sql basic ervaring heb ik vandaag Join en Count geleerd zonder hulp, en ben er al trots op dat deze query zover goed werkt:)
- Zoeken levert nix op, heb er geen goede omschrijving voor het probleem

Alvast bedankt :)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Nou, het is logisch dat het met deze query niet lukt. Je groupeert op een veld dat een nullwaarde bevat, en volgens mij is dit het logische resultaat. Je kan proberen om in de tabel Groepen ook een veld op te nemen met een lege groepsnaam (ik weet niet of ie hier null is of een lege string), dan zou het wel moeten werken. Al vind ik het nogal vaag dat je dit überhaupt wil. Waarom zou je iets dat toch wel redelijk belangrijk is, zoals een naamveld, leeg willen laten?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Als het je erom gaat dat iemand niet in een groep zit, dan definieer je toch gewoon een groep "none" of zo?

offtopic:
Treta? Geen theta?

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

-NMe- schreef op zaterdag 08 januari 2005 @ 02:45:
Nou, het is logisch dat het met deze query niet lukt. Je groupeert op een veld dat een nullwaarde bevat, en volgens mij is dit het logische resultaat. Je kan proberen om in de tabel Groepen ook een veld op te nemen met een lege groepsnaam (ik weet niet of ie hier null is of een lege string), dan zou het wel moeten werken. Al vind ik het nogal vaag dat je dit überhaupt wil. Waarom zou je iets dat toch wel redelijk belangrijk is, zoals een naamveld, leeg willen laten?
Dat zou ik gek vinden, want null = null zou moeten evalueren naar null, dus record weg.

Een oplossing zou kunnen liggen in het aanmaken van een 'default' groep en met een ifnull achtige functie de null values af te buigen naar die groep.

Who is John Galt?


  • schoene
  • Registratie: Maart 2003
  • Laatst online: 10:50
ik weet niet of het in het GROUP BY gedeelte zo is, maar in de WHERE-clause zal een vergelijking met een null-value altijd false zijn.
dus zowel
code:
1
2
select * from foo
where foo_column = ''

als
code:
1
2
select * from foo
where foo_column <> ''

zullen geen records bevatten waar foo_column NULL is. om de NULL-values eruit te halen
moet je
code:
1
2
select * from foo
where ISNULL(foo_column)

uitvoeren.


edit: hmmm, ik zou de post toch beter moeten lezen. toch wel off-topic. sorry

[ Voor 13% gewijzigd door schoene op 08-01-2005 12:58 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

justmental schreef op zaterdag 08 januari 2005 @ 12:07:
Dat zou ik gek vinden, want null = null zou moeten evalueren naar null, dus record weg.
Weet ik, ik legde het niet al te handig uit. :) Ik doelde er dus inderdaad op dat er een lege groep gemaakt moet worden (als in een lege string, niet NULL), of, zoals je zelf zegt, kan een default groep ook wel. Ik zet in ieder geval vraagtekens bij het geheel leeglaten van een naam-veld. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1