een eenvoudige, maar toch complexe SQL query?
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
SELECT
DISTINCT(bakkerid)
FROM
tussentabel
WHERE
broodid IN(6,7)
GROUP BY
DISTINCT(bakkerid)
HAVING
COUNT(bakkerid) > 1
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
Gewijzigd op 01/01/1970 01:00:00 door Klaasjan Boven
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.
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?
GROUP BY
DISTINCT(bakkerid)
eens in:
GROUP BY bakkerid
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... ?
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
Zodra bakekr 2 geen brood van type 8 meer verkoopt zal die er ook niet meer bij staan in de uitvoer.
Ik wil alleen de bakkers die broden 6, 7 én 8 verkopen. Anders was het inderdaad heel eenvoudig, maar helaas... :(
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
Dat zal bijv appel en peer geven.
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?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
"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
Gewijzigd op 01/01/1970 01:00:00 door Klaasjan Boven
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... ?......
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
Maw er is geen oplossing voor dit probleem?
Dan zal ik eens moeten kijken of ik de structuur van de databank kan aanpassen zodat ik wel de juiste informatie eruit kan halen.
Hoezo volgens mij klopt jouw datamodel juist een keer wel
SELECT * FROM bakkers WHERE brood = 'zoekterm'
?
en bij meerdere zoektermen meerdere ANDs erbij?
Code (php)
Moet makkelijker kunnen, maar dit kon ik snel ff verzinen.
helaas werkt het zo niet. Hij gaat per record kijken en per record heeft een bakker maar 1 type brood. Voorbeeld:
SELECT * FROM bakkers WHERE brood = 6 and brood = 7
Zie je het probleem?
@ Klaasjan:
Maar wat als de gebruiker maar 1 type brood opgeeft? Dan werkt de query dus niet.
En zie ook het probleem in de post van 14u40. Als ik 3 types brood opgeeft, werkt het ook niet.
Ja wel dan moet HAVING COUNT > 0 zijn.
Maar het probleem van gisteren van 14u40 (zie hierboven) blijft nog altijd.
Als ik de 3 types (6,7,8) zou ik enkel bakkerid 1 moeten krijgen, maar ik krijg zowel bakkerid 1 als 2.
Dus ik vrees dat er toch nog ergens een probleem in de query zit...
SELECT bakker_id
FROM bakkers
WHERE bakker_id IN (
SELECT bakker_id FROM bakkers WHERE brood_id = 6
)
AND bakker_id IN (
SELECT bakker_id FROM bakkers WHERE brood_id = 7
)
GROUP BY bakker_id
waarbij ik een extra geneste query toevoeg voor elke type van brood dat gezocht wordt.
Als er iemand een betere of andere oplossing vindt, altijd welkom! Alleszins bedankt voor de hulp iedereen!