Requête avec jointure externe, count et where

prince25 Messages postés 6 Date d'inscription   Statut Membre Dernière intervention   -  
 Prince25 -
Bonjour chers commentcamarchiens,

J'ai un petit problème pour executer une requête SQL de l'un de mes projets. Ma base de données est une gestion de bibliothèque. Je désire afficher le nombre de livres empruntés par chaque lecteur :

SELECT l.id_lecteur, nom_lecteur, prenom_lecteur, COUNT(id_exemplaire) "Nb"
FROM LECTEUR l
LEFT OUTER JOIN Emprunte_archive ea ON l.id_lecteur = ea.id_lecteur
GROUP BY l.id_lecteur, nom_lecteur, prenom_lecteur;


Résultat :
id_lecteur | nom_lecteur | prenom_lecteur | Nb
------------+-------------+----------------+----
2 | Dupond | Tony | 1
4 | Giersh | Annabelle | 2
1 | Moine | Jimmy | 0
5 | Bellabouvier | Matthieu | 1
3 | Farkli | Raphael | 1
(5 rows)

Jusque là tout va bien. Par contre, si je ne veux que les emprunts à partir d'une certaine date, il ne m'affiche plus les lecteurs avec un nombre égal à 0 :

SELECT l.id_lecteur, nom_lecteur, prenom_lecteur, COUNT(id_exemplaire) "Nb"
FROM LECTEUR l
LEFT OUTER JOIN Emprunte_archive ea ON l.id_lecteur = ea.id_lecteur
WHERE date_debut_archive > '2011-09-10'
GROUP BY l.id_lecteur, nom_lecteur, prenom_lecteur;


Résultat :
id_lecteur | nom_lecteur | prenom_lecteur | Nb
------------+-------------+----------------+----
4 | Giersh | Annabelle | 2
5 | Bellabouvier | Matthieu | 1
(2 rows)

Le problème est qu'il ne m'affiche plus les lecteurs sans emprunts, la jointure externe se perd. Sauriez-vous d'où vient mon problème ?

En espérant avoir été clair, Prince25.

2 réponses

Melooo Messages postés 1405 Date d'inscription   Statut Membre Dernière intervention   84
 
Salut,
Essayes de nous montrer les dates de début d'archive pour tes lignes de résultats (y compris les 0)
0
prince25 Messages postés 6 Date d'inscription   Statut Membre Dernière intervention   1
 
Salut Melooo et merci de me répondre,

Je pense que le plus simple est d'afficher ma table Emprunte_archive en marquant celles qui vérifient la condition du WHERE :

SELECT * FROM Emprunte_archive NATURAL JOIN Lecteur;

Resultat :
id_lecteur | id_exemplaire | date_debut_archive | date_fin_archive | nom_lecteur | prenom_lecteur | id_type_lecteur
------------+---------------+--------------------+------------------+-------------+----------------+-----------------
3 | 1 | 2011-04-21 | 2011-05-10 | Farkli | Raphael | 2
2 | 3 | 2011-08-03 | 2011-08-29 | Dupond | Tony | 1
5 | 4 | 2011-09-14 | 2011-10-06 | Bellabouvier | Matthieu | 3 ===> VERIFIE LE WHERE
4 | 6 | 2011-10-02 | 2011-10-24 | Giersh | Annabelle | 2 ===> VERIFIE LE WHERE
4 | 7 | 2011-12-22 | 2012-01-02 | Giersh | Annabelle | 2 ===> VERIFIE LE WHERE
(5 rows)
0
Melooo Messages postés 1405 Date d'inscription   Statut Membre Dernière intervention   84
 
Dans ta requête SQL tu as ca :
WHERE date_debut_archive > '2011-09-10'

Ce qui veut dire que tu veux seulement les lecteurs avec une date d'archive supérieur au 10 septembre 2011...
Donc ta requête te sort :
5 | 4 | 2011-09-14 | 2011-10-06 | Bellabouvier | Matthieu | 3 ===> VERIFIE LE WHERE
4 | 6 | 2011-10-02 | 2011-10-24 | Giersh | Annabelle | 2 ===> VERIFIE LE WHERE

Car ce sont les seuls lecteurs qui remplissent correctement ta clause where.
Donc le résultat de ta requête est tout à fait normal...
0
Prince25
 
Ah ouai d'accord mais le soucis c'est que magré mon WHERE, j'aimerais qu'il m'affiche quand même tous les lecteurs (avec un nombre d'emprunt égal à 0 si cas échéant)

Un truc qui ressemblerait à ca:
id_lecteur | nom_lecteur | prenom_lecteur | Nb
------------+-------------+----------------+----
2 | Dupond | Tony | 0
4 | Giersh | Annabelle | 2
1 | Moine | Jimmy | 0
5 | Bellabouvier | Matthieu | 1
3 | Farkli | Raphael | 0

Saurait-tu comment je pourrais faire ça ?
0
Melooo Messages postés 1405 Date d'inscription   Statut Membre Dernière intervention   84
 
Dis moi exactement l'intitulé de la requête, parce que c'est pas clair la ?
Que veux tu ?
0
Prince25
 
Intitulé de la requête : Afficher TOUS LES LECTEURS avec, pour chacun, le nombre d'emprunt supérieur à une date donnée.

Comme j'essaye de l'expliquer, j'aimerais que TOUS les lecteurs s'affichent, même s'ils n'ont fait aucun emprunt supérieur à la date donnée.

J'espère que c'est assez clair du coup... :P
0
Melooo Messages postés 1405 Date d'inscription   Statut Membre Dernière intervention   84
 
Euh je verrais un truc comme ca :
SELECT l.id_lecteur, nom_lecteur, prenom_lecteur, COUNT(id_exemplaire) "Nb"
FROM LECTEUR l
LEFT OUTER JOIN Emprunte_archive ea ON l.id_lecteur = ea.id_lecteur
WHERE date_debut_archive > '2011-09-10'
OR nombre_emprunt >= 0
GROUP BY l.id_lecteur, nom_lecteur, prenom_lecteur;

mais vraiment pas sur du résultat
0