Query die alle items laat zien

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Roberto Beer

Roberto Beer

09/01/2008 14:31:00
Quote Anchor link
Beste mensen,

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)
PHP script in nieuw venster Selecteer het PHP script
1
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
?>


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!
 
PHP hulp

PHP hulp

24/11/2024 07:34:38
 
Frank -

Frank -

09/01/2008 14:35:00
Quote Anchor link
De query is ongeldig en hoort een dikke error op te leveren. Je gebruikt een aggregate functie (COUNT), maar vergeet een correcte GROUP BY op te nemen.

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)
PHP script in nieuw venster Selecteer het PHP script
1
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

(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 -
 
Roberto Beer

Roberto Beer

09/01/2008 14:44:00
Quote Anchor link
Wauw, dat is echt fantastisch! Ik ben ook zo'n drol met SQL queries.

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?
 
Frank -

Frank -

09/01/2008 14:58:00
Quote Anchor link
Aggregate functies geven resultaten van een groep records. Alle gegevens die je opvraagt in de query, zullen dus op de héle groep betrekking moeten hebben. Dus zowel het id, als de achternaam, als de voornaam en het tussenvoegsel zullen gelijk moeten zijn. Vandaar dat je deze gegevens vermeldt in de GROUP BY, dan wordt er keurig een groepje aangemaakt.

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.
 



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.