Requête avec jointure externe, count et where

Fermé
prince25 Messages postés 6 Date d'inscription dimanche 18 mai 2008 Statut Membre Dernière intervention 26 décembre 2011 - 23 déc. 2011 à 20:07
 Prince25 - 28 déc. 2011 à 16:19
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 vendredi 28 novembre 2008 Statut Membre Dernière intervention 18 mars 2013 84
26 déc. 2011 à 16:53
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 dimanche 18 mai 2008 Statut Membre Dernière intervention 26 décembre 2011 1
26 déc. 2011 à 19:51
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 vendredi 28 novembre 2008 Statut Membre Dernière intervention 18 mars 2013 84
27 déc. 2011 à 08:37
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
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 vendredi 28 novembre 2008 Statut Membre Dernière intervention 18 mars 2013 84
28 déc. 2011 à 08:39
Dis moi exactement l'intitulé de la requête, parce que c'est pas clair la ?
Que veux tu ?
0
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 vendredi 28 novembre 2008 Statut Membre Dernière intervention 18 mars 2013 84
28 déc. 2011 à 14:27
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