Query die alle items laat zien
Ik ben bezig met een webwinkel. De voorkant van de website (de gebruikerskant dus) heeft op een bepaalde pagina een lijst met auteurs, die met behulp van de volgende query op het scherm wordt getoverd:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
// JOIN query
$query = "
SELECT auteurs.id, auteurs.achternaam, auteurs.voornaam, auteurs.tussenvoegsel, COUNT(boeken.auteurs_id) AS aantal_boeken
FROM auteurs, boeken
WHERE auteurs.id = boeken.auteurs_id
?>
// JOIN query
$query = "
SELECT auteurs.id, auteurs.achternaam, auteurs.voornaam, auteurs.tussenvoegsel, COUNT(boeken.auteurs_id) AS aantal_boeken
FROM auteurs, boeken
WHERE auteurs.id = boeken.auteurs_id
?>
De uitkomst komt in een tabelletje met 2 kolommen: naam auteur en aantal boeken.
Maar voor de achterkant van de website wil ik echter dat in de tabel ook de auteurs opgenomen worden die nog geen boek aan zich gekoppeld hebben. Wel wil ik graag de tweede kolom "aantal boeken" behouden. Bij ongekoppelde auteurs (een auteur die nog geen boeken heeft) staat er dan gewoon 0.
Hoe pas ik de query zo aan dat het ook deze auteurs laat zien? Ik weet wel dat " WHERE auteurs.id = boeken.auteurs_id " de reden is waarom de tabel geen auteurs opneemt met geen boeken.
Weet iemand hoe ik dit moet fixen, of moet ik de query helemaal omgooien?
Alvast bedankt!
Stel in MySQL de juiste ANSI-mode, dan krijg je tenminste een foutmelding wanneer je wat fout doet.
En verder de GROUP BY gaan gebruiken:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT
auteurs.id,
auteurs.achternaam,
auteurs.voornaam,
auteurs.tussenvoegsel,
COUNT(boeken.auteurs_id) AS aantal_boeken
FROM
auteurs
LEFT JOIN boeken ON auteurs.id = boeken.auteurs_id
GROUP BY
auteurs.id,
auteurs.achternaam,
auteurs.voornaam,
auteurs.tussenvoegsel
auteurs.id,
auteurs.achternaam,
auteurs.voornaam,
auteurs.tussenvoegsel,
COUNT(boeken.auteurs_id) AS aantal_boeken
FROM
auteurs
LEFT JOIN boeken ON auteurs.id = boeken.auteurs_id
GROUP BY
auteurs.id,
auteurs.achternaam,
auteurs.voornaam,
auteurs.tussenvoegsel
(niet getest)
Edit:
En een LEFT JOIN gebruiken, dat is waarschijnlijk de oplossing die je zoekt
Gewijzigd op 01/01/1970 01:00:00 door Frank -
Trouwens had ik wel " GROUP BY auteurs.id ", maar was ik deze vergeten in de topic te typen.
Wat is de reden waarom je het op alle vier de velden van auteurs groepeert en niet alleen op id?
Standaard eist MySQL dit niet, MySQL zal dan moeten raden welke gegevens jij wilt hebben. Dit kan tot gevolg hebben dat je de ene keer resultaat X retour krijgt en de andere keer resultaat Y. Ondanks dat je in beide gevallen resultaat Z zou moeten krijgen...
MySQL zuigt aan alle kanten en is dus van geen ene meter te vertrouwen. Door de juiste MODE in te stellen (zie de tutorial) gedraagt MySQL zich ietsjes beter, maar dan nog zul jij heel goed moeten controleren of jouw queries wel goed zijn. En dat is nu net het probleem met een beginner, die heeft daar weinig kaas van gegeten. MySQL is dus een database voor gevorderen, je moet namelijk wel heel goed weten wat je doet en nooit fouten maken.
Tip-van-de-dag: Gebruik PostgreSQL. Die keurt foute data af, keurt foute queries af, is 100% betrouwbaar, veel sneller en kan veel meer. Daarnaast nog net ietsjes meer gratis.