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

Requêtes MySQL Discussion :

Récupérer en 1 requêtes le total des lignes + condition


Sujet :

Requêtes MySQL

  1. #1
    Membre confirmé Avatar de Sayrus
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    899
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 899
    Points : 570
    Points
    570
    Par défaut Récupérer en 1 requêtes le total des lignes + condition
    Bonjour,

    Ma question est certainement très simple mais j'avoue que je sèche...

    J'ai une table "user" avec les champs id, nom, codeId
    J'ai aussi la table "results" avec les champs id, userId, datec

    Question:

    Comment en 1 requête (si possible) récupérer le contenu du nombre total de requête et aussi le total des requêtes ayant la pour datec 1985-04-25 par exemple.

    Je sais que c'est facile à faire en plusieurs requêtes, mais j'aimerais le faire en 1 seule requête si possible. J'ai donc commencé par faire ceci mais je ne sais pas comment obtenir le résultat total pour la date indiqué le tout en une requête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT u.nom, u.id, COUNT(r.id) as nbr_results 
    FROM users AS u 
    INNER JOIN  results AS r 
    ON u.id=r.userId 
    WHERE u.codeId=1 
    GROUP BY u.codeId 
    ORDER BY u.nom ASC
    Que dois ajouter à ma requête pour obtenir par ligne le nombre total de résultats ayant pour r.datec="1985-04-25" ? Est-ce possible en une seule requête?

    Merci!

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2009
    Messages : 736
    Points : 1 101
    Points
    1 101
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT u.nom, u.id, COUNT(r.id) AS nbr_results, (select * from table condition) as nbr_par_date
    FROM users AS u 
    INNER JOIN  results AS r 
    ON u.id=r.userId 
    WHERE u.codeId=1 
    GROUP BY u.codeId 
    ORDER BY u.nom ASC
    A la recherche d'un film : http://chercher-un-film.com

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Faire un GROUP BY codeId alors qu'il y a une condition de restriction qui impose que ce codeId soit égal à 1, c'est sans doute une coquille !

    Doivent figurer dans le GROUP BY toutes les colonnes du SELECT ne faisant pas l'objet d'une fonction de calcul (SUM, COUNT, AVG, MIN, MAX).

    Comme tu as fait une jointure interne, compter les r.id revient en fait à compter les lignes donc COUNT(*) est suffisant. Si tu veux afficher tous les users, même ceux n'ayant pas de results, alors il faut une jointure externe.

    Et pour compter séparément ceux qui ont une datec spécifique, il faut attribuer la valeur 1 a cette condition à l'aide d'un CASE et en faire la somme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT u.nom, u.id, 
      COUNT(r.id) AS nbr_results,
      SUM
      (
        CASE
          WHEN r.datec = '1985-04-25' THEN 1
          ELSE 0
        END
      ) AS nbr_1985_04_25
    FROM users AS u 
    LEFT OUTER JOIN  results AS r ON u.id = r.userId 
    WHERE u.codeId = 1 
    GROUP BY u.nom, u.id 
    ORDER BY u.nom ASC
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Membre confirmé Avatar de Sayrus
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    899
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 899
    Points : 570
    Points
    570
    Par défaut
    Merci à vous deux pour votre réponse et explications!

    Le 'WHERE u.codeId=1' est en fait dynamique... j'ai mis la valeur 1 pour l'exemple, ça peut être n'importe quel entier.

    Par contre je suis étonné du 'CASE'... C'est la première fois que j'en entends parler et pourtant j'en vu pas mal des gars qui donnent cours sur le SQL.

    Cependant, heureux d'apprendre que c'est possible, comme quoi on en apprend tous les jours!

    Un grand merci en tout cas!

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Sayrus Voir le message
    Par contre je suis étonné du 'CASE'... C'est la première fois que j'en entends parler et pourtant j'en vu pas mal des gars qui donnent cours sur le SQL.
    Plus d'informations dans le cours de SQLPro.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Membre confirmé Avatar de Sayrus
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    899
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 899
    Points : 570
    Points
    570
    Par défaut
    Merci pour le lien

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

Discussions similaires

  1. Requête SQL mettre des ligne dans des colonnes
    Par karim66 dans le forum Requêtes
    Réponses: 2
    Dernier message: 22/02/2012, 20h57
  2. Requête pour multiplier des lignes selon des bornes
    Par Jinroh77 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 31/03/2011, 14h05
  3. Requête SQL, transformer des lignes en colonne
    Par gadget2 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 01/11/2010, 20h50
  4. [AC-2007] Total des lignes d'un sous formulaire
    Par pierredraft dans le forum IHM
    Réponses: 2
    Dernier message: 08/06/2009, 10h53
  5. Requête qui exclut des lignes
    Par will89 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/04/2007, 11h43

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