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

@Peter K,
zou je de eerste conditie niet liever als ON images.image_id = albumimages.imagebase_id aan INNER JOIN toevoegen?
@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.
Voor de goede orde:

Een INNER JOIN zonder voorwaarden (ON of USING) is eigenlijk een CROSS JOIN. MySQL laat dit toe, maar er zijn systemen waar dit niet kan.

Of het in performance uit kan maken laat ik even in het midden, het is gewoon geen nette SQL.

Reageren