[MySQL] vraagje over query

Pagina: 1
Acties:

  • Mitsah
  • Registratie: Februari 2002
  • Laatst online: 09-10-2024
Hoi,

ik heb de volgende tabellen:

aanbieder met de velden id, nummer, naam (de rest is niet belangrijk)
accommodatie met de velden id, id_aanbieder, nummer, naam_accommodatie (rest is niet belangrijk)

Nu heeft elke aanbieder een of meerdere accommodaties. Er zijn echter ook aanbieders die nog geen accommodatie hebben en daarvan wil ik een overzicht.

Ik dacht dit met de volgende query te kunnen, maar dat is volgens mij niet goed. Ik krijg namelijk geen resultaat en ik weet zeker dat er aanbieders zonder accommodatie zijn.

PHP:
1
2
3
4
5
6
7
8
9
SELECT 
    a.nummer, 
    a.achternaam,
    COUNT(ac.nummer)
FROM
    aanbieder a, accommodatie ac
WHERE
    ac.id_aanbieder = a.id
GROUP BY a.nummer HAVING COUNT(ac.nummer) < 1

Wie kan me helpen. Alvast bedankt

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 21-08 21:44

MBV

Zoieso heb je de regel 4 count(ac.nummer) niet nodig, dit geeft info die je niet wil (je selecteert degene die dezelfde waarde hebben, nl 0 ). En je beschrijving van de tabellen komt niet overeen met de PHP :? :P code: a.achternaam ipv naam.
Wat krijg je als je HAVING COUNT.... weglaat in regel 9?

* MBV is geen zeikerd :)

  • Coltrui
  • Registratie: Maart 2001
  • Niet online

Coltrui

iddqd

Deze beschrijft een bijna gelijkaardig probleem...
Succes!

Verwijderd

De HAVING verwacht dat je het veld dat je met de groepfunctie COUNT(ac.nummer) gaat tellen gebruikt hebt voor de GROUP BY. Aangezien je daar a.nummer en niet ac.nummer hebt gebruikt doet dat niet wat je verwacht.

Nu als ik het goed begrijp zou ik verwachten dat je een reeks aanbieders hebt. En dat als een accomodatie gelinked is met een aanbieder het veld id_aanbieder geset zal zijn.
Als jij dan een left join doet op a.id = ac.id_aanbieder dan zal hij enkel die combinaties maken die mogelijk zijn en de accomodaties zonder aanbieder laten vallen.
Wat je daarna dus in de GROUP BY of de HAVING doet zal daar geen verschil aan maken.

In echte SQL zou je het volgende doen

SELECT a.nummer, a.achternaam
FROM aanbieder a
WHERE NOT EXISTS(SELECT 1 FROM accomodatie ac WHERE ac.id_aanbieder = a.id)

Probleem is dat MySQL geen subqueries ondersteund dus moet je een andere oplossing zoeken. Een mogelijkheid is de LEFT JOIN binnen de FROM als volgt.

SELECT a.nummer, a.achternaam
FROM aanbieder a
LEFT JOIN accomodatie ac ON (a.id = ac.id_aanbieder)
WHERE ac.id_aanbieder IS NULL

Nouja ik ben niet helemaal zeker maar ik denk dat dat een resultaat geeft dat je kan gebruiken. Zou zoveel leuker zijn als die 1.4.1 tree van MySQL eindelijk eens zou uitkomen.

  • Mitsah
  • Registratie: Februari 2002
  • Laatst online: 09-10-2024
Somey: harstikke bedankt! Je code klopt precies.

De anderen ook bedankt voor de hulp natuurlijk!

[ Voor 35% gewijzigd door Mitsah op 07-03-2003 11:21 ]