PHP-lessen - les 3.6 - Werken met MySQL-databases. Typen van de JOIN-operator.
In MySQL kun je gegevens selecteren met behulp van JOIN op verschillende manieren. We zullen proberen al deze soorten queries te bekijken. Hier is de lijst met alle JOIN-querytypen:
- INNER JOIN
- LEFT JOIN
- LEFT JOIN zonder overlapping met de rechtertabel
- RIGHT JOIN
- RIGHT JOIN zonder overlapping met de linkertabel
- FULL OUTER
- FULL OUTER waarbij de linker- of rechtertabel leeg is
Hier is een illustratie van deze soorten JOIN:
Ik zal aan het artikel bestanden van onze site toevoegen, waaronder join.php, waarin ik alle records zal weergeven met behulp van verschillende JOIN-operatoren.
INNER JOIN
We beginnen met de INNER JOIN-operator, omdat deze standaard wordt gebruikt als je in de query gewoon JOIN schrijft. Deze operator selecteert alle records uit twee tabellen waar de voorwaarde na de ON-operator wordt vervuld. We hebben twee tabellen: Files en Messages:
Tabel Messages:
mid | bodytext | fid |
1 | Test | NULL |
2 | Hi | 2 |
3 | Hello | NULL |
Tabel Files:
fid | path |
1 | /files/1.png |
2 | /files/2.png |
3 | /files/3.png |
De query met JOIN ziet er als volgt uit:
SELECT * FROM Messages INNER JOIN Files ON Messages.fid=Files.fid
Het resultaat zal de volgende records weergeven:
mid | bodytext | fid | path |
2 | Hi | 2 | /files/2.png |
Met andere woorden, waar de fid’s overeenkomen, toont MySQL deze rijen.
LEFT JOIN
Met LEFT JOIN halen we alle records op uit de linkertabel (in ons geval Messages), inclusief de records waarvan de fid-waarden voorkomen in de tabel Files.
Tabel Messages:
mid | bodytext | fid |
1 | Test | 2 |
2 | Hi | NULL |
3 | Hello | 3 |
Tabel Files:
fid | path |
1 | /files/1.png |
2 | /files/2.png |
3 | /files/3.png |
De query met LEFT JOIN ziet er zo uit:
SELECT * FROM Messages LEFT JOIN Files ON Messages.fid=Files.fid
Het resultaat zal de volgende records weergeven:
mid | bodytext | fid | path |
1 | Test | 2 | /files/2.png |
2 | Hi | NULL | NULL |
3 | Hello | 3 | /files/3.png |
LEFT JOIN is handig wanneer we alle berichten willen tonen, ongeacht of er een bestand is gekoppeld of niet — dat kunnen we later in PHP controleren.
LEFT JOIN zonder overlapping met de rechtertabel
LEFT JOIN zonder overlapping toont alle records uit de linkertabel, behalve die waarvan fid ook voorkomt in de rechtertabel.
Tabel Messages:
mid | bodytext | fid |
1 | Test | 2 |
2 | Hi | NULL |
3 | Hello | 3 |
Tabel Files:
fid | path |
1 | /files/1.png |
2 | /files/2.png |
3 | /files/3.png |
De query zonder overlapping ziet er zo uit:
SELECT * FROM Messages LEFT JOIN Files ON Messages.fid=Files.fid WHERE Files.fid IS NULL
Het resultaat van deze selectie is:
mid | bodytext | fid | path |
2 | Hi | NULL | NULL |
LEFT JOIN zonder overlapping is nuttig wanneer we alle berichten zonder bijgevoegde bestanden willen tonen.
RIGHT JOIN
RIGHT JOIN toont alle records uit de rechtertabel, en als er overeenkomsten zijn, worden ook de bijbehorende gegevens uit de linkertabel getoond.
Tabel Messages:
mid | bodytext | fid |
1 | Test | 2 |
2 | Hi | NULL |
3 | Hello | 3 |
Tabel Files:
fid | path |
1 | /files/1.png |
2 | /files/2.png |
3 | /files/3.png |
De query met RIGHT JOIN:
SELECT * FROM Messages RIGHT JOIN Files ON Messages.fid=Files.fid
Het resultaat van deze query is:
mid | bodytext | fid | path |
NULL | NULL | 1 | /files/1.png |
1 | Test | 2 | /files/2.png |
3 | Hello | 3 | /files/3.png |
RIGHT JOIN is handig wanneer we alle bestanden willen weergeven, ongeacht of ze ergens gebruikt worden of niet — gewoon alle bestanden.
RIGHT JOIN zonder overlapping
RIGHT JOIN zonder overlapping toont alle records uit de rechtertabel, behalve die waarvoor er een overeenkomst is met de linkertabel.
Tabel Messages: