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 :

Joindre 2 requêtes pour n'en avoir qu'une


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    510
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 510
    Points : 127
    Points
    127
    Par défaut Joindre 2 requêtes pour n'en avoir qu'une
    Bonjour à toutes et tous

    j'ai 2 requêtes différentes :
    une permettant de connaître le nombre d'activité en salle "nb_salle" qu'un adhérent peut avoir dans les cours .
    la table adherents_cours a l'id de l'adhérents l'id de l'activté et si le cours est à l'année "adherents_cours.annee=1".
    nbreA représentant dans la table adherents le nombre d'activité prise à l'année, y compris les activités en salle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT  adherents.ID, adherents.nom, adherents_cours.annee, adherents.nbreA, COUNT(adherents.ID) AS nb_salle
    FROM adherents
    INNER JOIN adherents_cours ON adherents_cours.id_adherent = adherents.ID
    INNER JOIN activites ON activites.ID = adherents_cours.id_activite
    WHERE adherents_cours.id_saison = 7  AND activites.duree_seance = 1.25 AND activites.ID<>197 AND activites.ID<>198 AND adherents_cours.annee=1 
    GROUP BY adherents.ID 
    ORDER BY `nb_salle`  DESC, nbreA DESC LIMIT 500;
    Une deuxième:
    qui additionne tous les achats "achats.total_annees_reduit" de tous les adhérents
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT achats.id_adherent, SUM(achats.total_annees_reduit) AS tot
    FROM achats
    WHERE achats.id_saison = 7 
    GROUP BY achats.id_adherent  
    ORDER BY tot  DESC
    LIMIT 500;
    moi j'aurais voulu extraire les achats seulement des adhérents qui ont au moins une activité en salle.
    mais lorsque j'essaie de faire une seule requete, elle s'éxécute mais est totalement fausse.
    je la marque mais ce n'est sur pas bon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT achats.id_adherent, adherents.nom, adherents_cours.annee, adherents.nbreA, COUNT(adherents.ID) AS nb_salle, SUM(achats.total_annees_reduit) AS tot
    FROM achats
    INNER JOIN adherents ON adherents.ID = achats.id_adherent
    INNER JOIN adherents_cours ON adherents_cours.id_adherent = adherents.ID
    INNER JOIN activites ON activites.ID = adherents_cours.id_activite 
    WHERE adherents_cours.id_saison = 7  AND (activites.duree_seance = 1.25 OR activites.duree_seance = 1) AND activites.ID<>197 AND activites.ID<>198 AND adherents_cours.annee=1 
    GROUP BY adherents.ID 
    ORDER BY `nb_salle`  DESC, nbreA DESC LIMIT 500;

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 311
    Points : 39 677
    Points
    39 677
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Il faut savoir que GROUP BY sert à calculer des agrégats pour les colonnes citées.
    Les agrégats sont la somme, la moyenne, le nombre, le minimum ou le maximum.

    Or, dans votre première requête vous donnez une liste de colonnes dans la clause SELECT qui ne font pas l'objet d'un regroupement (absente du GROUP BY) et qui ne font l'objet d'aucun calcul d'agrégat.
    C'est incohérent et tout autre SGBD que MySQL vous aurait envoyé une bordée d'injures.

    Et dans votre deuxième requête vous voulez la somme pour la totalité, donc sans critère de regroupement, c'est évidemment incompatible.

    Pour qu'on vous propose une solution, merci de fournir le script DDL de création des tables et le script permettant d'insérer un jeu de données de quelques lignes.

  3. #3
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    510
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 510
    Points : 127
    Points
    127
    Par défaut
    merci pour cette réponse rapide.

    merci de fournir le script DDL de création des tables
    je ne sais pas ce que c'est ?

    et le script permettant d'insérer un jeu de données de quelques lignes.
    vous voulez des lignes des tables concernées ?

  4. #4
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    510
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 510
    Points : 127
    Points
    127
    Par défaut
    j'ai envoyé trop rapidement !

    vous me dites :
    Or, dans votre première requête vous donnez une liste de colonnes dans la clause SELECT qui ne font pas l'objet d'un regroupement (absente du GROUP BY) et qui ne font l'objet d'aucun calcul d'agrégat.
    alors que dans les deux requêtes je fais "GROUP BY adherents.ID " et la colonne concernée "COUNT(adherents.ID) AS nb_salle"
    dans l'autre "GROUP BY achats.id_adherent " et la somme "SUM(achats.total_annees_reduit)" s'effectue bien par groupe d'id_adherents sinon j'ai une seule ligne avec la somme totale

    peut être qu'elles ne sont pas académiques mais elles fonctionnent, je ne suis pas contre une écriture correcte de ces requêtes

    Merci encore

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 311
    Points : 39 677
    Points
    39 677
    Billets dans le blog
    9
    Par défaut
    Le DDL c'est le script SQL de création des tables (les ordres CREATE et ALTER TABLE)
    Et il faut également un extrait du jeu de données de chacune des tables en jeu (nous ne pouvons évidemment pas deviner le contenu).

    Ce qui ne va pas dans la première requête, c'est que le GROUP BY ne porte que sur adherents.ID, or la clause SELECT mentionne aussi adherents.nom, adherents_cours.annee et adherents.nbreA qui ne font l'objet d'aucun agrégat.

Discussions similaires

  1. Réinitialiser les ID pour éviter d'avoir des "trous"
    Par arnaudperfect dans le forum Requêtes
    Réponses: 3
    Dernier message: 13/11/2007, 11h56
  2. Réponses: 1
    Dernier message: 28/06/2007, 12h23
  3. Réponses: 2
    Dernier message: 15/04/2007, 13h10
  4. Joindre plusieurs tables pour en former qu'une seule.
    Par timeout dans le forum Requêtes
    Réponses: 7
    Dernier message: 19/09/2005, 09h18
  5. Joindre 2 colonnes pour en afficher une seule
    Par major2 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/04/2005, 15h17

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