kookboek mysql select vraag

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een de volgende database opzet en zou nu 1 select querie maken waarmee ik in een keer de juiste gegevens uit de database kan halen.

Afbeeldingslocatie: http://www.miss-dynastie.nl/kookboek.jpg

alvast bedankt voor degene die hier een goed idee voor heeft hoe deze querie het beste gemaakt zou kunnen worden.

ik had zelf dit er al van gemaakt... (ik weet dus ondertussen al dat deze helemaal niet goed geschreven is en dat ik met een join zou moeten gaan werken maar de vraag is of iemand zo vriendelijk wil zijn mij op weg te helpen):

SELECT kookboek.*, categorie.*, land.*, ingredienten_koppel.* FROM kookboek, categorie, land, ingredienten_koppel WHERE kookboek.categorie_id=categorie.id AND kookboek.land_id=land.id AND kookboek.ingredienten_id=ingredienten_koppel.id

maar dat gaat dus niet goed omdat ik dan bij de weergave bij elk ingredient opnieuw de gegevens uit kookboek krijg

[ Voor 13% gewijzigd door Verwijderd op 05-11-2006 17:37 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

Naast het feit dat je plaatje niet werkt snap ik je probleem niet helemaal. Je krijgt immers alle gegevens die je wilt. Omdat je een koppeling hebt zul je inderdaad meerdere keren dezelfde waarde tgenkomen in een kolom, maar elk record in de resultset is wel verschillend. Hoe had je het anders terug willen zien?

De uiteindelijke gegevens mooi vormgegeven op het scherm zetten is niet de taak van je query, maar van je buisnesslogic en view code. Je zult zelf (met bv php) deze resultset om moeten zetten en er een leuke html pagina van moeten maken.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
SQL:
1
2
3
4
5
6
SELECT k.*, c.*, l.*, i.*
FROM `kookboek` AS `k`
INNER JOIN `categorie` AS `c` ON k.categorie_id = c.id
INNER JOIN `land` AS `l` ON k.land_id = l.`id`
OUTER JOIN `ingredient_koppel` AS `ik` ON ik.id = k.ingredient_id
OUTER JOIN `ingredient` AS `i` ON i.id = ik.ingredient_id


@janoz, plaatje werkt wel, je moet nog een keer klikken

[ Voor 10% gewijzigd door BasieP op 05-11-2006 17:43 ]

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
plaatje deed het niet nu wel.

wat ik eigenlijk bedoelde te zeggen is hoe ik het voor elkaar krijg dat hij dus die ingredienten uit ingredienten tabel als 1 waarde terug geeft of hoe ik dat zou kunnen loepen

ik dacht dat je daar dus een join voor moest maken maar dat heb ik dus blijkbaar mis?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
dank BassieP, zoiets bedoelde ik dus, maar begreep niet helemaal hoe ik dat moest doen als ik meerder joins had respect voor je snelle antwoord

Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
zou zo kunnen dat ie voor geen meter werkt, want ik heb hem niet getest..

wat jij denk ik bedoelt is dat je 1 record terug krijgt ipv een aantal (waar dus alle ingredienten in staan)

dit komt omdat jij een inner join doet (op de oude manier)
dit zorgt ervoor dat ie alleen joint als zowel het record uit de ene als uit de andere tabel bestaat.

eigenlijk wil je dit ook niet met een inner of outer join doen, aangezien je maar 1x je kookboek/land/categorie wilt opvragen, maar wel meerdere ingredienten
het zijn dus eigenlijk gewoon 2 queries

[ Voor 76% gewijzigd door BasieP op 05-11-2006 17:47 ]

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

  • Rac-On
  • Registratie: November 2003
  • Niet online
je db model klopt niet helemaal imho. Op dit moment is er een 1 op 1 relatie tussen kookboek.id en kookboek.ingredientid. Die 2de kolom kan je dus gerust weghalen.
Je tabel ingredient_koppel zou ik daarnaast de kolom hoeveelheid aan toevoegen.
Je unique key in ingredient_koppel wordt dan id + id_ingredient (en je zou id eventueel kun renamen naar kookboek_id).

Daarnaast zoals Basie zegt, gewoon lekker alles joinen op de waarde die je met een pijl in je tekening hebt staan en dan komt het goed.

doet niet aan icons, usertitels of signatures


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ja had daar ook al aangedacht Rac-on inderdaad kookboek.id is inderdaad zelfde als ingredient_id dat zou misschien later met vullen ook wat problemen kunnen voorkomen denk dat ik hem inderdaad aanpas, het is uiteindelijk weer een dubbele waarde die niet nodig is in het database model

Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
@ rac-on

je hebt niet helemaal gelijk, hij heeft nu een n op n relatie (dmv een koppeltable dus)
dit is nodig want in 1 recept zitten meerdere ingredienten, maar 1 ingredient komt ook voor in meerdere recepten.
je kan dus niet de koppeltabel weghalen

de naamgeving is echter wel wat ongelukkig

[ Voor 8% gewijzigd door BasieP op 05-11-2006 17:51 ]

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

  • Rac-On
  • Registratie: November 2003
  • Niet online
BasieP schreef op zondag 05 november 2006 @ 17:51:
@ rac-on

je hebt niet helemaal gelijk, hij heeft nu een n op n relatie (dmv een koppeltable dus)
dit is nodig want in 1 recept zitten meerdere ingredienten, maar 1 ingredient komt ook voor in meerdere recepten.
je kan dus niet de koppeltabel weghalen

de naamgeving is echter wel wat ongelukkig
hey basie, dat bedoelde ik niet.

Ik bedoelde dat je de kolom ingredient_id in de tabel kookboek weg kunt halen.

En vervolgens in de ingredient_koppel tabel het hoofdid uit de tabel kookboek kunt gebruiken. Nu heeft iedere row in 'kookboek' namelijk een id en een ingredient_id wat hetzelfde is.

edit:
plaatje voor de duidelijkheid:
Afbeeldingslocatie: http://rac-on.nl/public/pictures/kookboek.jpg
en dan eventueel dus dingen als hoeveelheid toevoegen aan ingredient_koppel

[ Voor 10% gewijzigd door Rac-On op 05-11-2006 17:57 ]

doet niet aan icons, usertitels of signatures


Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
Rac-On schreef op zondag 05 november 2006 @ 17:53:
[...]

hey basie, dat bedoelde ik niet.

Ik bedoelde dat je de kolom ingredient_id in de tabel kookboek weg kunt halen.

En vervolgens in de ingredient_koppel tabel het hoofdid uit de tabel kookboek kunt gebruiken. Nu heeft iedere row in 'kookboek' namelijk een id en een ingredient_id wat hetzelfde is.
ah oke dan begreep ik je verkeerd, je hebt helemaal gelijk :)

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
zoals Rac-ON het bedoelde (alhans zoals ik het zelf ook had gezien was dat kookboek.id zelfde is als kookboek.ingredienten_id) en een van die twee kan dus weg omdat je nu dus dubbele data in de tabel hebt.

:)

Plaatje is helemaal duidelijk wat je er nu bij hebt staan

[ Voor 12% gewijzigd door Verwijderd op 05-11-2006 17:59 ]


Acties:
  • 0 Henk 'm!

  • ID-College
  • Registratie: November 2003
  • Laatst online: 23:05
Redundantie noemt men dat :P
Maar idd, je zal eerst goed moeten normaliseren zodat je dit dus niet krijgt. Je kan dit ook met de normaalvormen doen :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
die had ik ook gebruikt maar had eigenlijk een afweging of ik dat extra id er wel in zou zetten of niet dacht dat het voor de duidelijkheid misschien beter zou zijn. maar voor de normaal vorm was het niet goed, dat wist ik zelf ook al omdat het voor dubbele waardes zorgt. maar heb hem nu toch maar aangepast zodat hij nu wel voldoet aan de normaal vorm dat extra id veld had totaal geen nut verder dus heb de handel aangepast zoals rac-on had gemeld

zo ik ben er bijna met de querie maar hij is nog niet helemaal goed :(

SELECT kookboek.*, categorie.*, land.*, ingredienten.*, ingredienten_koppel.* FROM kookboek INNER JOIN categorie ON kookboek.categorie_id = categorie.id INNER JOIN land ON kookboek.land_id = land.id INNER JOIN ingredienten_koppel ON ingredienten_koppel.id = kookboek.id INNER JOIN ingredienten ON ingredienten.id_ingredient = ingredienten_koppel.id

[ Voor 44% gewijzigd door Verwijderd op 05-11-2006 19:19 ]

Pagina: 1