bij een foto-archief horen 3 tabellen: images (met o.a image_id en filename), albums (met o.a album_id en omschrijving) en een koppeltabel albumimages (met albumimage_id, albumbase_id en imagebase_id).
Nu wil ik door middel van de tabellen images en albumimages een overzicht krijgen met alle foto's uit bijv. album 5 en 8. Uit 1 album gaat wel goed, maar bij het toevoegen van een tweede album gaat het steeds verkeerd. Hieronder de SQL-query voor 1 album.
SELECT image_id, filename, albumbase_id
FROM images, albumimages
WHERE images.image_id = albumimages.imagebase_id
AND albumimages.albumbase_id = 5
ORDER BY images.image_id ASC
Hoe kan ik hier nog een selectie overheen gooien? B.v.d. Auke.
Zie hieronder het resultaat. Let op dat je overal dezelfde manier gebruikt van het aanroepen van je kolommen. Het is veel makkelijker fouten zoeken als een groot deel al benoemd is. Zo is alles snel terug te vinden.
Daarnaast heb ik er een JOIN toegevoegd ipv de komma's die je gebruikte.
Tevens is het ook handig als je je query netjes opbouwd met het inspringen van regels etc. In een later stadium kun je dit weer weghalen als je zeker weet dat het werkt. Tijdens het scripten is het wel heel handig, je ziet direct wat er waar gebeurd.
SELECT
images.image_id,
images.filename,
albumimages.albumbase_id
FROM
images
INNER JOIN albumimages
WHERE
images.image_id = albumimages.imagebase_id AND
((albumimages.albumbase_id = 5) OR (albumimages.albumbase_id = 8))
ORDER BY
images.image_id ASC
@Jan goede vraag. Ik heb me er wel eens in verdiept, ben nooit echt tot een conclusie gekomen hiervoor. Naar het schijnt maakt het voor het resultaat niet uit. Wellicht in de performance wel?
Misschien dat iemand hier meer verstand van heeft?
De ON is logischer en 'moderner' dan WHERE a.id = b.id.
Plus het voordeel dat je SQL beter leesbaarder wordt.
Daarnaast kan je wellicht beter IN (...) gebruiken.
Dat houdt je SQL korter (en makkelijker uitbreidbaar):
SELECT
images.image_id,
images.filename,
albumimages.albumbase_id
FROM images AS i
INNER JOIN albumimages AS a
ON i.image_id = a.imagebase_id
WHERE a.albumbase_id IN (5, 8)
ORDER BY a.album_naam DESC, i.image_id ASC
Let even op dat ik ook je ORDER BY aangepast hebt aan de album_naam. Die heb je misschien niet, dus let daar even op ;)
Daarnaast is het gebruik van aliassen (AS i) puur voor je eigen leesbaarheid en snelheid. Je maakt minder typefouten en je code wordt overzichtelijker.
Met IN kan je gewoon de 'id' achter elkaar zetten, bijvoorbeeld met echo implode($ids, ", ");.
Peter, Jan en Eddy bedankt voor de snelle reacties en bijbehorende uitleg en tips. Voor het resultaat maakt het inderdaad niet uit welke methode je gebruikt, want beide methodes geven het goede resultaat weer.
Dank, ik ben weer iets wijzer en blijer. Groet Auke.