Hallo allen,

Ik hoop dat jullie me op de juiste weg kunnen krijgen met het volgende probleem. Het is echter wel wat leeswerk, excuses hiervoor ;)

Het probleem: Ik ben bezig met mijn muziekcollectie, maar ben nog niet kundig genoeg met PHP om alles zo voor elkaar te krijgen. Dankzij het internet is het meeste zo opgezocht, maar soms loop ik tegen een probleem aan wat waarschijnlijk heel simpel is, maar waar ik toch niet uitkom. Zoals dit dus ;)

Ik wil een overzichtspagina met ArtiestNaam, ClipNaam en Genre, keurig op alfabet etc. Via het phpscriptje roep ik alle gegevens uit de database op die van belang zijn op deze pagina en geef deze weer

Nu is het probleem natuurlijk dat ik ook graag meerdere genres per artiest zou willen weergeven. Ik heb hiervoor een koppeltabel aangemaakt, en gebruik nu de volgende (relevante) tabellen;

Artiest (ArtiestID, ArtiestNaam),
Nummer (NummerID, ArtiestID, NummerNaam),
Genre (GenreID, GenreNaam),
ArtiestGenre (GenreID, ArtiestID)

Nu loop ik echter tegen het probleem aan, dat ik dit niet netjes weergegeven krijg als ik een hele lijst met nummers/artiesten oproep. Zolang een artiest onder 1 genre valt, wordt dit keurig weergegeven, bij meerdere genres krijg ik echter de gegevens ook meerdere keren terug. Er wordt een nieuwe rij voor elk genre aangemaakt.

Nu krijg ik bijvoorbeeld
Savage Garden - Truly Madly, Deeply – Pop (Bij 1 ingevuld genre)
Shakira – Pure Intuition – Pop
Shakira – Pure Intuition – Latin (Bij meerdere ingevulde genres)

Terwijl de gewenste output is:
Savage Garden - Truly Madly, Deeply – Pop
Shakira – Pure Intuition – Latin, Pop


Mijn huidige script (gestript van overbodige zooi):

<?php
$begin = strtolower($_GET['c']);

$select = "SELECT NummerID, NummerNaam, MJArtiest.ArtiestID, ArtiestNaam, MJGenre.GenreID, GenreNaam FROM MJNummer, MJArtiest, MJGenre, MJArtiestGenre WHERE
MJNummer.ArtiestID = MJArtiest.ArtiestID AND
MJArtiestGenre.ArtiestID = MJArtiest.ArtiestID AND
MJArtiestGenre.GenreID = MJGenre.GenreID AND
ArtiestNaam LIKE '$begin%' ORDER BY ArtiestNaam";

$query = mysql_query($select)or die(mysql_error());

while($list = mysql_fetch_object($query)){

echo $list->ArtiestNaam;
echo " - ";
echo $list->NummerNaam;
echo " - ";
echo $list->GenreNaam;
echo "<BR>";
;}?>

Nu zou ik dus graag willen weten hoe ik dan wel de gewenste output krijg. Het is waarschijnlijk iets heel simpels, maar ik kom er zo niet uit. Wie kan me op het juiste spoor helpen? Gebruik ik hiervoor nou een Group By, of moet ik het in een hele andere hoek zoeken? Wie zet me op het juiste pad?

Bij voorbaat dank, alleen al voor het lezen van dit hele gebeuren ;)
Allereerst klopt je datamodel niet helemaal. Je koppelt nu een genre aan een artiest terwijl dat eigenlijk niet een eigenschap van een artiest is. Een genre is een eigenschap van een nummer, dus moet je die eigenschap ook daaraan koppelen.

Verder kun je niet zo heel veel aan de output van de database veranderen. Als er meerdere genres aan een nummer gekoppeld zijn, zal dat record altijd meerdere keren getoond worden waarbij dan dus alleen het genre verschilt. Dit kun je verder met php wel oplossen, of je zou een tweede query kunnen gebruiken om per nummer alle genres op te halen.
Ik ben ook zoiets aan het schrijven.

normaliseer tips:

- Je schrijft niet 2x een artiest in de database. Een artiest kan meerdere nummers/albums hebben dus maak je ze kenbaar door artiest_id en niet door de naam.

Mijn systeem heeft bijvoorbeeld het volgende:

artiesten, labels, cd's, genres. Helemaal genormaliseerd en gelinkt. Zo kan een genre meerdere artiesten bevatten een label kan ook meerdere artiesten bevatten en zelf een artiest kan meerder labels bevatten(bijv europese en aziatische distributie). Als mijn systeem volledig klaar is zal ik hem hier in de script lib gooien.
Allen bedankt voor de reacties.

Blanche: Ik ben het er niet helemaal mee eens dat een genre aan een nummer is gekoppeld. Dit gaat ook uitstekend per artiest, werkt net zo goed volgens mij? En die oplossing/2e query is dus precies wat ik in deze situatie zoek.

Jurgen: Normaliseren is bekend en gedaan. Er worden geen artiesten dubbel geplaatst zover ik weet, en koppelen gebeurt dmv de ID's.

Jelmer: leesvoer, bedankt! Ik zal me daar even in verdiepen, eens kijken hoe dit werkt.

Reageren