MySQL query vraagje

Ik heb een database genaamd 'beschrijvingen'. In die db heb ik zes velden, waarvan één 'category' heet. Nu wil ik bijvoorbeeld alle gegevens ophalen wanneer de categorie 'movies' is. Daarvoor had ik deze query bedacht. Maar die geeft een foutmelding. Wat doe ik fout?

[code:1:796ba09375]SELECT * FROM beschrijvingen WHERE category = movies[/code:1:796ba09375]

Let op de aanhalingstekening. Het gaat hiet om een niet-numeriek veld.

[code:1:68a9878fa2]SELECT * FROM beschrijvingen WHERE category = ‘movies’[/code:1:68a9878fa2]

Oh ja, het is ook zo simpel! Thanks a lot!

Mag ik een tip geven?

Je database ontwerp lijkt een klein probleemje te hebben. Het is nu namelijke erg moeilijk om de naam van de categorie bij te werken (dan moet je alle velden hebben).

Slimmer is een extra tabel aan te maken met CategoryId en Category, waarij CategoryId een auto-increment krijgt. Je kunt dan in je tabel beschrijvingen volstaan met het melden van de CategoryId. Op die manier gebruik je minder ruimte en heb je minder risico dat de data incosistent wordt.

Maar goed, het is natuurlijk maar een ongevraagde tip :wink: doe ermee wat je wilt.

Ik heb een id veld hoor! Bedankt iig!

[quote:d0da82a129="Skilip"]Ik heb een id veld hoor! Bedankt iig![/quote:d0da82a129]

Uh, je begrijpt 'm niet helemaal, denk ik… anders zou je query er uit zien als (voorbeeld):

[code:1:d0da82a129]SELECT * FROM beschrijvingen WHERE category = 1[/code:1:d0da82a129]

[b:cb57589cb8]Categorieen[/b:cb57589cb8] cat_id || categorie

[b:cb57589cb8]Beschrijvingen[/b:cb57589cb8]
id || cat_id || Kolom 3 || Kolom 4 || Kolom 5

Ah, nee ik begrijp hem niet. Ik heb nu een klein CMS-je waarmee ik een portfolio bijhoud. Ik heb vier categorieën die in een select box worden geselecteerd. Dus als ik een nieuw item toevoeg aan mijn portfolio worden de volgende rijen gevult:

ID =>(auto increment)
title => naam van het item
image_path => pad naar het plaatje
thumb_path => pad naar de thumbnail
category => De categorie, en dus ook de map waarin hij geplaatst wordt
description => omschrijving van het item

Het is misschien handiger om in plaats van een tekst-veld "category" een numeriek veld te maken "category_id". Deze verwijst dan naar een "ID" veld in een tweede tabel: Category, waarin ID => (auto increment) en category_name (tekst).

Hierdoor kan je de lijst met categorieen gemakkelijker beheren en deze lijst gebruiken om je “select box” te vullen. Vergeet alleen niet een foreign key relatie te leggen tussen de velden Category_ID in je 1e tabel en “ID” uit de nieuwe Category tabel.

Succes :slight_smile:

[quote:52c27cad6f="EwaldK"][quote:52c27cad6f="Skilip"]Ik heb een id veld hoor! Bedankt iig![/quote:52c27cad6f]

Uh, je begrijpt 'm niet helemaal, denk ik… anders zou je query er uit zien als (voorbeeld):

[code:1:52c27cad6f]SELECT * FROM beschrijvingen WHERE category = 1[/code:1:52c27cad6f][/quote:52c27cad6f]

Ook zo doe je het natuurlijk niet. Als je met meerdere tabellen werkt, ga je natuurlijk joins gebruiken…

[code:1:52c27cad6f]SELECT * FROM beschrijvingen JOIN Category using (CategeoryID) where Category.CategoryName = ‘movies’;[/code:1:52c27cad6f]

of

[code:1:52c27cad6f]SELECT * FROM beschrijvingen JOIN Category ON Category.CategoryID=beschrijvingen.CategoryID where Category.CategoryName=‘movies’;[/code:1:52c27cad6f]

Jeemig, ik moet nog het een en ander leren zie ik :oops:

[quote:bff6b009fe="wmstudio"][quote:bff6b009fe="EwaldK"][quote:bff6b009fe="Skilip"]Ik heb een id veld hoor! Bedankt iig![/quote:bff6b009fe]

Uh, je begrijpt 'm niet helemaal, denk ik… anders zou je query er uit zien als (voorbeeld):

[code:1:bff6b009fe]SELECT * FROM beschrijvingen WHERE category = 1[/code:1:bff6b009fe][/quote:bff6b009fe]

Ook zo doe je het natuurlijk niet. Als je met meerdere tabellen werkt, ga je natuurlijk joins gebruiken…

[code:1:bff6b009fe]SELECT * FROM beschrijvingen JOIN Category using (CategeoryID) where Category.CategoryName = ‘movies’;[/code:1:bff6b009fe]

of

[code:1:bff6b009fe]SELECT * FROM beschrijvingen JOIN Category ON Category.CategoryID=beschrijvingen.CategoryID where Category.CategoryName=‘movies’;[/code:1:bff6b009fe][/quote:bff6b009fe]

Dat doe je alleen als je expliciet op de string “movies” zou willen zoeken, dan heb je idd. de join naar de categorie-beschrijvingen nodig.
Als je weet naar welke id je wilt zoeken, dan kan je wel degelijk mijn voorbeeld gebruiken :stuck_out_tongue:

[quote:2e49a840a6="Skilip"]Jeemig, ik moet nog het een en ander leren zie ik :oops:[/quote:2e49a840a6]

Ach, zo ingewikkeld is het ook weer niet. Het nadeel van de methode zoals het nu opgezet is:

als je bijvoorbeeld de tekst “movies’ ooit nog eens in iets anders zou willen veranderen (bijvoorbeeld “films”) dan zal je alle records langs moeten om dat gegeven te wijzigen.
of als je per ongeluk een type foutje zou maken en als tekst “mvies” zou intypen dan zal dat record nooit in de selectie van " movies” terecht komen. zoals je al zelf aangeeft kunnen de meeste database programma’s dat wel ondervangen door je een selectie-boxje te presenteren van alle waarden die ingevoerd zijn in de betreffende kolom)

Dat is dus de reden dat het handiger is om een aparte beschrijvingen-tabel te maken.

[quote:6865d1d623="EwaldK"][quote:6865d1d623="Skilip"]Jeemig, ik moet nog het een en ander leren zie ik :oops:[/quote:6865d1d623]

Ach, zo ingewikkeld is het ook weer niet. Het nadeel van de methode zoals het nu opgezet is:

als je bijvoorbeeld de tekst “movies’ ooit nog eens in iets anders zou willen veranderen (bijvoorbeeld “films”) dan zal je alle records langs moeten om dat gegeven te wijzigen.
of als je per ongeluk een type foutje zou maken en als tekst “mvies” zou intypen dan zal dat record nooit in de selectie van " movies” terecht komen. zoals je al zelf aangeeft kunnen de meeste database programma’s dat wel ondervangen door je een selectie-boxje te presenteren van alle waarden die ingevoerd zijn in de betreffende kolom)

Dat is dus de reden dat het handiger is om een aparte beschrijvingen-tabel te maken.[/quote:6865d1d623]

Normalisatie