[MySql] (redelijk eenvoudige?) query met IF werkt niet

Pagina: 1
Acties:

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 08-10 13:03
Situatie:

Ik heb drie tabellen in mijn db:

code:
1
2
3
Automerken:         [ID][naam]             //gegevens automerken
Garages:            [ID][naam]             //gegevens garages
Garages_automerken: [automerkId][garageId] //koppelt automerken aan garages


Probleem

Ik wil een query die als resultaat geeft: alle automerkgegevens + een kolom 'in garage' die de waarde 'ja' of 'nee' geeft, als betreffende automerk in een van de garages aanwezig is.

Mijn poging:
SQL:
1
2
3
4
5
SELECT
ID, 
naam, 
IF((SELECT automerkId FROM Garages_automerken WHERE automerkId = ID)=NULL, 'nee', 'ja')
FROM `Automerken`


Deze query werkt niet: de SELECT in IF geeft meer dan 1 waarde terug. Dit klopt natuurlijk, maar ik wil dat hij voor iedere rij apart gaat IF-en.

Het is al de 80ste niet-werkende query + de uitleg op MySQL.com is niet erg behulpzaam (ze geven daar alleen erg simpele voorbeeldje, IF 1>0)

Kan een van jullie mij op weg helpen in deze materie?

[ Voor 5% gewijzigd door Rekcor op 21-03-2007 12:35 . Reden: voorbeeldje klopte niet ]


  • Bolukan
  • Registratie: Oktober 2002
  • Laatst online: 01-12 12:05
IS NULL ipv = NULL ??

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
je kan denk ik makkelijker een join gebruiken...

hoe kan het trouwens dat die select in de IF meerdere records teruggeeft? een auto kan toch niet op meerdere plaatsen tegelijk staan?

[ Voor 58% gewijzigd door P.O. Box op 21-03-2007 12:28 ]


  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 08-10 13:03
Edwardvb schreef op woensdag 21 maart 2007 @ 12:27:
je kan denk ik makkelijker een join gebruiken...

hoe kan het trouwens dat die select in de IF meerdere records teruggeeft? een auto kan toch niet op meerdere plaatsen tegelijk staan?
Heel scherp. In het echt gaat het niet om auto's maar om orderregels. In ieder geval: heb auto's gewijzigd in automerken. Dank.

Een join kan m.i. niet, omdat een garage meerdere automerken, en een automerk meerdere garages kan bevatten (many-to-many)

[ Voor 12% gewijzigd door Rekcor op 21-03-2007 12:34 ]


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
Je wilt dus weten of een orderregel in een van je orders voorkomt....

dus of bijvoorbeeld er een volkswagen in een van de garages staat...

dan zou ik een join gebruiken met een group by en een count...

dus:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
select
   automerken.id,
   automerken.naam,
   count(garages_automerken.garageId)
from
   automerken
left join
   garage_automerken
on
   automerken.id = garage_automerken.id
group by
   automerken.id


als count > 0 dan "ja" anders "nee"

Verwijderd

Je kan ook werken met IFNULL als functie in mysql

SQL:
1
IFNULL(expr1,expr2) 

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 08-10 13:03
Edwardvb schreef op woensdag 21 maart 2007 @ 12:38:
Je wilt dus weten of een orderregel in een van je orders voorkomt....

dus of bijvoorbeeld er een volkswagen in een van de garages staat...

dan zou ik een join gebruiken met een group by en een count...

dus:

SQL:
1
(...)
Mmm... deze werkt wel (bedankt!) maar ik kan er niet meer in zoeken middels where.

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
select
   automerken.id,
   automerken.naam,
   count(garages_automerken.garageId)
from
   automerken
left join
   garage_automerken
on
   automerken.id = garage_automerken.id
where
  automerken.id = 1
group by
   automerken.id


Geeft als foutmelding: 'Invalid use of GROUP function'... (ik moet dus iets met HAVING doen)

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 08-10 13:03
Verwijderd schreef op woensdag 21 maart 2007 @ 13:22:
Je kan ook werken met IFNULL als functie in mysql

SQL:
1
IFNULL(expr1,expr2) 
Kun je hiervan een voorbeeldje geven?

Verwijderd

Wat wil je dan precies?

Zien of een auto gekoppeld is aan een garage of een overzicht van een merk auto's en garage's waar deze is zitten? Ik vind het een beetje onduidelijk.

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 08-10 13:03
Verwijderd schreef op woensdag 21 maart 2007 @ 22:12:
Wat wil je dan precies?

Zien of een auto gekoppeld is aan een garage of een overzicht van een merk auto's en garage's waar deze is zitten? Ik vind het een beetje onduidelijk.
Ik wil weten of een automerk in een van de garages (maakt niet uit welke) aanwezig is.

De koppeling tussen automerken en garages geschiedt in een ander (lookup)tabel.

Verwijderd

Rekcor schreef op woensdag 21 maart 2007 @ 13:59:
[...]


Kun je hiervan een voorbeeldje geven?
Google is your friend :)

http://www.smallsql.de/doc/sql-functions/system/ifnull.html

mbt die where: dit kun je ook in de JOIN verwerken...

[ Voor 10% gewijzigd door Verwijderd op 22-03-2007 09:36 ]


  • KoW
  • Registratie: Juli 2001
  • Laatst online: 17-08-2022

KoW

Parse parsed te veel

Rekcor schreef op woensdag 21 maart 2007 @ 13:38:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
select
   automerken.id,
   automerken.naam,
   count(garages_automerken.garageId)
from
   automerken
left join
   garage_automerken
on
   automerken.id = garage_automerken.id
where
  automerken.id = 1
group by
   automerken.id


Geeft als foutmelding: 'Invalid use of GROUP function'... (ik moet dus iets met HAVING doen)
Je groupt op een veld in je parent tabel. In dit geval moet je groupen op je child tabel denk ik. In je child tabel doe je je count.
Probeer eens
SQL:
1
group by garage_automerken.id

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 08-10 13:03
Verwijderd schreef op donderdag 22 maart 2007 @ 09:32:
[...]

Google is your friend :)

http://www.smallsql.de/doc/sql-functions/system/ifnull.html

mbt die where: dit kun je ook in de JOIN verwerken...
Bedankt, maar ik bedoelde: kun je een voorbeeldje geven van IFNULL in de SQL van mijn eerste post (want ik neem aan dat je bedoelde dat ik IFNULL daar moest gebruiken...)

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 08-10 13:03
KoW schreef op donderdag 22 maart 2007 @ 10:39:
[...]

Je groupt op een veld in je parent tabel. In dit geval moet je groupen op je child tabel denk ik. In je child tabel doe je je count.
Probeer eens
SQL:
1
group by garage_automerken.id
Bedankt. Nee het lag aan mijn WHERE. Als je wilt selecteren op een 'grouped' kolom, moet je HAVING gebruiken ipv WHERE... Intussen heb ik de code werkend.

[ Voor 3% gewijzigd door Rekcor op 22-03-2007 10:54 ]


Verwijderd

Rekcor schreef op donderdag 22 maart 2007 @ 10:52:
[...]


Bedankt, maar ik bedoelde: kun je een voorbeeldje geven van IFNULL in de SQL van mijn eerste post (want ik neem aan dat je bedoelde dat ik IFNULL daar moest gebruiken...)
Ik heb niet gezegd dat je IFNULL moest gebruiken, heb alleen de uitleg even voor je opgezocht; neem aan dat je daarmee toch wel kunt bedenken wat het moet zijn? 8)7

Verwijderd

Ik denk inderdaad dat de IFNULL je niet verder zal helpen.
Wel denk ik dat je het met een CASE kan oplossen.

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT m.ID,
m.naam,
CASE
  WHEN m.ID IN
    (SELECT automerkId
      FROM Garages_automerken
      WHERE automerkId = m.id
    )
  THEN 'ja'
 ELSE 'nee'
END AS in_garage
FROM Automerken AS m

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 08-10 13:03
Verwijderd schreef op donderdag 22 maart 2007 @ 11:52:
[...]

Ik heb niet gezegd dat je IFNULL moest gebruiken, heb alleen de uitleg even voor je opgezocht; neem aan dat je daarmee toch wel kunt bedenken wat het moet zijn? 8)7
Mmm... een beetje vaag wordt het zo. Ik heb namelijk ook niet gezegd dat ik IFNULL wilde gebruiken :) Ik reageerde op een post van Schutje285, die beweerde het wel te willen (waarop ik vroeg: geef dan eens een voorbeeldje [voor mijn probleem])...

Anyway: heel veel bedankt voor het opzoeken van de uitleg van IFNULL. ;)

@Schutje, bedankt!
Pagina: 1