Zit met het volgende probleem:

Stel de volgende tabel

id bakkerid broodid
1 1 6
2 1 7
3 2 6
4 2 8

Deze tabel geeft aan welke bakker welk type van brood verkoopt. Daarnaast heb ik nog 2 andere tabellen met meer info over de bakkers en meer info over de types brood

Ik wil uit deze tabel alle bakkers halen die broodtype 6 en 7 verkopen. Alleen bakker 1 voldoet hieraan, want bakker 2 verkoopt brood 7 niet.

Hoe kan ik dit met een SQL query te weten komen? Het lijkt eenvoudig, maar ik geraak er niet aan uit...
Hou er rekening mee dat er tientallen types brood kunnen zijn waarvoor een bakker gevonden moet worden.

De eerste tabel, met unieke ids, is niet noodzakelijk, dus die kan weg als dat helpt.

SELECT 
    DISTINCT(bakkerid) 
FROM 
    tussentabel 
WHERE 
    broodid IN(6,7)
GROUP BY 
    DISTINCT(bakkerid)
HAVING 
    COUNT(bakkerid) > 1



Volgens mij moet het deze zijn.
Je moet iig met GROUP BY en HAVING aan de gang, let op mysql schijnt hier niet zo sterk in te zijn.

Edit ivm Jan zijn post
Aanvulling: om fouten te voorkomen zou ik eisen dan de combi bakkerid - broodid UNIQUE moet zijn, anders kan de query van Klaasjan toch verkeerde resultaten geven.
hmm, lukt helaas niet...

hij aanvaardt hier bij mij die "IN (6,7)" blijkbaar niet ?

Ik werk met MySQL 5.0.24a en phpmyadmin 2.8.2.4 als dat belangrijk is?
Lijkt me sterk dat het probleem in die IN zit. Verander die

GROUP BY
DISTINCT(bakkerid)

eens in:

GROUP BY bakkerid
sorry voor het late antwoord (onverwacht weekendje zonder internet)

OK, bedankt Jan en Klaasjan, met die laatste tip (distinct weglaten) lukt het idd.

Maar ik denk niet dat ik de query goed begrijp. Kan je 'm eens in woorden uitleggen? Waarom die laatste 'group by' en 'having' ?

Ook werkt het hier nog niet helemaal... Als er maar op 1 type brood gezocht wordt, maw er zit maar 1 id in de 'in-set', dan worden er geen resultaten gevonden... ?
nog een foutje gevonden:

stel dat ik volgende tabel heb:

bakkerid broodid
1 6
1 7
1 8
2 6
2 8

en ik voer volgende query uit:

SELECT DISTINCT(bakkerid)
FROM tussentabel
WHERE
broodid IN(6,7,8)
GROUP BY
bakkerid
HAVING
COUNT(bakkerid) > 1

dan zou ik enkel 1 moeten terugkrijgen, maar ik krijg zowel 1 als 2 terug
newbie als ik ben. Je vraagt het bakkers id op die brood verkoopt van type 6 7 of 8. Volgens mij is het dan logisch dat bakker 2 er tussen staan omdat die ook het brood type 8 verkoopt. Dus bakker 1 en 2 staan in de uitvoer.
Zodra bakekr 2 geen brood van type 8 meer verkoopt zal die er ook niet meer bij staan in de uitvoer.
die "of" die je vermeldt is belangrijk. Ik moet een "en" hebben :-)

Ik wil alleen de bakkers die broden 6, 7 én 8 verkopen. Anders was het inderdaad heel eenvoudig, maar helaas... :(
Inderdaad,

Je kijkt met de IN of hij een van de waarden heeft dus OF 6 OF 7 OF 8.

In reactie op je eerdere vraag:
GROUP BY en HAVING zijn volgens mij de lastigste dingetjes uit SQL

Als je zelf een veld 'maakt' of 'berekend' kan je die niet in de WHERE conditie gebruiken. Dan zal je met HAVING aan de gang moeten. En zoals je snapt moet je dan ook altijd GROUP BY gebruiken.

voorbeeld

SELECT fruit FROM tabel WHERE kleur = groen

Dat zal bijv appel en peer geven.


<?php
"SELECT 
COUNT(fruit) // aantal soorten
FROM
tabel
WHERE kleur = groen // zal 2 opleveren
GROUP BY fruit // je wil maar een resultaat namelijk een aantal
HAVING COUNT(fruit) > 2" // dit getal bereken jezelf en zit niet in de DB dus HAVING gebruiken
?>
DIT zal 2 opleveren


Hopelijk is het nu duidelijk

Klaasjan
Stefke schreef op 10.01.2007 14:31
sorry voor ...

Ook werkt het hier nog niet helemaal... Als er maar op 1 type brood gezocht wordt, maw er zit maar 1 id in de 'in-set', dan worden er geen resultaten gevonden... ?......


Dat klopt want hij wil 2 X het bakkerid vinden dus hij moet minimaal vinden

BROOD_ID BAKKER_ID
BROOD_ID BAKKER_ID

Dat komt door ... HAVING COUNT(bakkerid) > 1

Reageren