een eenvoudige, maar toch complexe SQL query?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Stefke

Stefke

05/01/2007 19:41:00
Quote Anchor link
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.
 
PHP hulp

PHP hulp

19/11/2024 15:31:37
 
Klaasjan Boven

Klaasjan Boven

05/01/2007 19:56:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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



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
 
Jan Koehoorn

Jan Koehoorn

05/01/2007 19:57:00
Quote Anchor link
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.
 
Stefke

Stefke

05/01/2007 22:00:00
Quote Anchor link
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?
 
Jan Koehoorn

Jan Koehoorn

05/01/2007 22:14:00
Quote Anchor link
Lijkt me sterk dat het probleem in die IN zit. Verander die

GROUP BY
DISTINCT(bakkerid)

eens in:

GROUP BY bakkerid
 
Stefke

Stefke

10/01/2007 14:31:00
Quote Anchor link
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... ?
 
Stefke

Stefke

10/01/2007 14:40:00
Quote Anchor link
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
 
Erik Smit

Erik Smit

10/01/2007 15:25:00
Quote Anchor link
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.
 
Stefke

Stefke

10/01/2007 15:32:00
Quote Anchor link
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... :(
 
Klaasjan Boven

Klaasjan Boven

10/01/2007 15:35:00
Quote Anchor link
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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT fruit FROM tabel WHERE kleur = groen

Dat zal bijv appel en peer geven.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


Hopelijk is het nu duidelijk

Klaasjan
Gewijzigd op 01/01/1970 01:00:00 door Klaasjan Boven
 
Klaasjan Boven

Klaasjan Boven

10/01/2007 15:39:00
Quote Anchor link
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
 
Stefke

Stefke

10/01/2007 15:53:00
Quote Anchor link
ok, ik denk dat het nu duidelijker is, bedankt.

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.
 
Klaasjan Boven

Klaasjan Boven

10/01/2007 18:58:00
Quote Anchor link
Hoezo volgens mij klopt jouw datamodel juist een keer wel
 
Niek s

niek s

10/01/2007 19:10:00
Quote Anchor link
waarom neit zo?:

SELECT * FROM bakkers WHERE brood = 'zoekterm'
?
en bij meerdere zoektermen meerdere ANDs erbij?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
$query
= "SELECT bakkerid FROM bakkers WHERE brood = '".$zoekterm[0]."'";
foreach($zoekterm as $value) {
    if($value != $zoekterm[0]) {
        $query .= " AND brood = '".$value."'";
    }
}

?>

Moet makkelijker kunnen, maar dit kon ik snel ff verzinen.
 
Stefke

Stefke

10/01/2007 21:19:00
Quote Anchor link
@ niek:
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.
 
Klaasjan Boven

Klaasjan Boven

10/01/2007 23:32:00
Quote Anchor link
Ja wel dan moet HAVING COUNT > 0 zijn.
 
Stefke

Stefke

11/01/2007 09:41:00
Quote Anchor link
Ok, dat werktµ met 1 broodid in de set.

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...
 
Stefke

Stefke

12/01/2007 09:40:00
Quote Anchor link
Ik los het voorlopig als volgt op:

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!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.