Momenteel ben ik bezig met een webshop waarin boeken verkocht gaan worden. Het systeem wordt met de hand gebouwd en is dus volledig op maat ontworpen om alles zo optimaal mogelijk te maken voor boeken.

De moeilijkheid zit hem nu in het veld met de auteur(s) van een boek. Het zit namelijk zo: een boek kan één of meerdere auteurs hebben. Indien er meerdere auteurs zijn, wordt er rekening gehouden met de volgorde (de eerstgenoemde auteur is vaak de 'belangrijkste' auteur). Tot slot kan het nog zijn dat er erg veel mensen mee hebben gewerkt die niet allemaal los genoemd worden, dan wordt achter het gewone rijte van (de) auteur(s) de tekst "en anderen" toegevoegd.

Om het wat minder abstract te maken, even een voorbeeldje van een aantal mogelijke opties:
- Eric Cartman
- Eric Cartman, Stan Marsh en Kyle Broflovski
- Eric Cartman en anderen
- Eric Cartman, Stan Marsh en anderen

Voor de opslag van deze data heb ik voor de volgende opbouw gekozen:
book
- id
- author-others*

book_author
- book_id
- author_id
- number**

author
- id
- first-name
- last-name

* Boolean voor de suffix "en anderen".
** Nummer van de auteur bij een bepaald boek, om de volgorde te bepalen. Iemand toevallig een idee voor een betere naam?

Het probleem zit hem nu in het ophalen van de data: hoe kan ik een lijst met boeken én bijbehorende auteurs (in een array) ophalen? Misschien lukt het met trucjes nog wel om de auteurs al door MySQL te formatteren tot de uiteindelijke string, maar dat is absoluut niet de bedoeling. Ik wil dat ik gewoon een array met de auteurs (id, first-name, last-name en number) krijg en die op welke manier dan ook kan verwerken. Een klein voorbeeldje van hoe ik deze data wil hebben vind je hier.

Mijn vraag is nu dus: hoe kan ik dit zo handig mogelijk doen? Ik vrees dat dit niet gaat lukken met één query, dus moet ik nu per boek nog een query uitvoeren om de auteurs op de halen? Of hebben jullie misschien goede ideeën hierover?
Wat voor query heb je zelf kunnen bedenken om het in 1 keer uit de database te kunnen halen.
Jonathan DatBenIk op 12/06/2010 13:09:48

Een klein voorbeeldje van hoe ik deze data wil hebben vind je hier.


503 Service Unavailable

[edit]
Hij doet het al weer ....
[/edit]
@Noppes: Het probleem is dus dat ik zelf nog geen query hiervoor heb of kan bedenken. Het lukt natuurlijk best om dit met twee queries op te lossen ("SELECT * FROM book" en "SELECT author.*, book_author.number FROM author, book_author WHERE author.id = book_author.author_id AND book_author.book_id = %d ORDER BY book_author.number"), maar de bedoeling is toch om het efficiënter te doen.
Wel het kan best efficienter zijn om het op deze manier te doen, maar uiteraard kan je de tabel book ook nog bij de 2de query erbij joinen.

Alleen wordt ik dan weer totaal gek van het gebruik van de * in de select-clause, benoem de velden waar je wat mee gaat doen!
@Noppes: hoe bedoel je, de tabel book JOIN'en bij de query om de auteurs op te halen? Mijn hele bedoeling is om alles (zowel boeken als auteurs) in één querie te doen. Die * is natuurlijk alleen zo in dit voorbeeldje, in de praktijk benoem ik natuurlijk netjes de namen van de kolommen ;-)
Wat is dan je probleem, want het principe van joinen schijn je te begrijpen
@Noppes: Ik wil met één query een lijst met boeken ophalen, met daarin per boek een array met alle auteurs. En ik heb totaal geen idee hoe ik dat kan doen. Zie dus nog even mijn voorbeeld, dat is wat ik dus met één query wil verkrijgen.
SQL levert altijd een twee-dimensional vlak aan data op. Als het niet in Excel past, kan je het niet ophalen met SQL. Zo simpel is het, en het zuigt. Had je maar geen SQL database moeten gebruiken.

De enige oplossing is om je "array" tot string te maken binnen de database, en dan wanneer je hem eruit hebt gehaald hem weer uit elkaar te trekken. GROUP_CONCAT kan hierbij helpen. Maar er is hoe dan ook een bewerkingsstap achteraf nodig.
Je verwijst naar iets wat niet bestaat.

Aanname is dan dat je een hele mooie multidimensionale array wilt opzetten. Maar zolang jij niet toont - met bijvoorbeeld een stukje relevante php code - waar dan jouw probleem ligt, wordt het lastig om je de juiste richting in te trappen.


Note: een GROUPBY_CONCAT heb je niet nodig
@Jelmer: Oké, als echt multidimensionaal niet kan is die GROUP_CONCAT een mooi compromis. Ik zal eens gaan proberen of dat gaat lukken. In ieder geval bedankt, dit was waart ik naar zocht!

@Noppes: Dat is (was) het probleem dus: ik had geen idee of dit bestond of mogelijk was, en zo ja, hoe precies. het probleem waar jij om vraagt was dus: ik wist niet hoe ik dit kon doen en had ook geen idee in welke richting ik had moeten zoeken. Waarschijnlijk gaat het wel lukken met het antwoord van Jelmer, maar in ieder geval bedankt voor het meedenken!

Reageren