IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Requête sur 2 tables et tris sur un champs calculé


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2005
    Messages : 75
    Points : 44
    Points
    44
    Par défaut Requête sur 2 tables et tris sur un champs calculé
    J'ai une table "membres" et une table "emprunts".

    Table membres:
    membreId, membreNom, membrePrenom, etc.

    Table emprunts:
    empruntId, membreId, livreId, date, etc.

    J'aimerai, via une requête SQL récupérer un jeu d'enregistrement qui s'affichera dans un tableau HTML avec possibilité de trier selon divers colonnes / critères. Une de ces colonnes / critères est le nombre total d'emprunts pour chaque membres. Par exemple, dans mon tableau-résultat j'aurai

    Nom Prénom Emprunts
    Dupont Henri 18
    Dubuis James 25
    Hubert Mireille 3

    Le champs "Emprunts" dans mon tableau-résultat est donc un champs calculé (probablement avec SUM()) à partir de la table "emprunts" où chaque emprunt est un enregistrement.

    J'aimerai que ce champs soit un véritable alias afin de pouvoir faire des tris dessus. Je ne vois vraiment pas comment construire ma requête...

    Mon niveau de débutant SQL me permet de savoir qu'avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT membres.memberId, membres.membreNom, membres.membrePrenom
    FROM members, emprunts
    WHERE members.memberId = emprunts.memberId
    j'obtiens tous les membres ayant fait un emprunt.

    Mais comment afficher le nombre d'emprunts et pouvoir trier dessus?

    J'immagine quelque chose comme cela? (c'est faut, bien sûr...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT membres.memberId, membres.membreNom, membres.membrePrenom, SUM(emprunts.empruntId WHERE members.memberId = emprunts.memberId) AS totalEmprunts
    FROM members, emprunts
    WHERE members.memberId = emprunts.memberId
    ORDER BY totalEmprunts
    Enfin, je précise que je dois implémenter cela avec MySQL (sortie HTML en PHP), si jamais MySQL devait présenter des caractéristiques particulières relatives à ma question, mais je ne pense pas.

    Merci d'avance pour votre aide, je ne trouve pas quelle doc répond à ma question...

  2. #2
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT membres.memberId, membres.membreNom, membres.membrePrenom, 
    COUNT(emprunts.empruntId) AS totalEmprunts
    FROM members, emprunts
    WHERE members.memberId = emprunts.memberId
    GROUP BY membres.memberId, membres.membreNom, membres.membrePrenom
    ORDER BY totalEmprunts;
    Tu devrais plutôt employer la syntaxe normée (INNER JOIN) pour les jointure si ta version le permet et les alias :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT m.memberId, m.membreNom, m.membrePrenom, 
    COUNT(e.empruntId) AS totalEmprunts
    FROM members m INNER JOIN emprunts e
                           ON m.memberId = e.memberId
    GROUP BY m.memberId, m.membreNom, m.membrePrenom
    ORDER BY totalEmprunts;
    Cette requête ne compte que les membres ayant au moins un emprunt, sinon, il faut une jointure externe.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2005
    Messages : 75
    Points : 44
    Points
    44
    Par défaut
    Merci bcp pour ta réponse Médiat!

    Cela marche très bien, merci!

    Par contre, en efft, je veux récupérer tous les membres, y compris ceux qui ont 0 emprunts...

    Qu'est-ce / comment faire une jointure externe? Dans ce cas?

  4. #4
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Avec les jointures normées, il suffit de remplacer INNER JOIN par LEFT [OUTER] JOIN.

    Les [] pour indiquer que OUTER est généralement optionnel.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2005
    Messages : 75
    Points : 44
    Points
    44
    Par défaut
    Super, merci beaucoup et bonne journée!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de tri sur une table
    Par zzzantoine dans le forum VBA Access
    Réponses: 3
    Dernier message: 22/08/2008, 16h18
  2. [WD 12] Problème de tri sur une table
    Par L.Lemarchand dans le forum WinDev
    Réponses: 7
    Dernier message: 26/06/2008, 01h00
  3. Requête SQL via les composants ADO sur une Table Access 97
    Par Didier100 dans le forum Bases de données
    Réponses: 9
    Dernier message: 21/12/2007, 15h43
  4. Tri sur 2 tables
    Par VARACH dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/09/2006, 15h57
  5. [Access] Requête sur une table et tri sur une autre
    Par VooDooS dans le forum Langage SQL
    Réponses: 2
    Dernier message: 30/08/2006, 16h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo