meerdere selecties uit meerdere tabellen in 1 query

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Auke Reimert

Auke Reimert

12/11/2014 02:44:44
Quote Anchor link
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.
 
PHP hulp

PHP hulp

08/11/2024 16:44:05
 
Peter K

Peter K

12/11/2014 07:10:52
Quote Anchor link
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.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
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 de Laet

Jan de Laet

12/11/2014 08:03:23
Quote Anchor link
@Peter K,
zou je de eerste conditie niet liever als ON images.image_id = albumimages.imagebase_id aan INNER JOIN toevoegen?
 
Peter K

Peter K

12/11/2014 10:03:46
Quote Anchor link
@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?
 
Eddy E

Eddy E

12/11/2014 11:20:53
Quote Anchor link
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):

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
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, ", ");.
 
Auke Reimert

Auke Reimert

12/11/2014 18:07:54
Quote Anchor link
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.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

12/11/2014 18:46:16
Quote Anchor link
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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.