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

 MySQL Discussion :

Imbriquer une requete renvoyant plusieurs resultats dans une autre requete [Fait]


Sujet :

MySQL

  1. #1
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut Imbriquer une requete renvoyant plusieurs resultats dans une autre requete
    Bonjour,

    Je vous explique mon soucis.
    Je possède 2 tables :

    Une première qui possède les identifiants d'un agent :
    Agents (Nom_equipe, Prenom_Agent, Id_Agents )

    Une seconde qui trace les ventes faites par l'agent :
    Vente (Id_Agents, Service_vendu )

    Les services sont identifiés comme ca :
    Service A
    Service B
    etc ...

    Je veux pouvoir requeter le nombre de service de type A vendus par une équipe.

    Il faut donc que je fasse une requete de l'Id_Agents dans la table Agents (qui me renvoie plusieurs résultats ) . et cette requete est imbriqués dans la second qui compte le nombre de service.

    Je ne trouve pas du tout le cheminement pour arriver à mes fins.

    Merci de votre Aide.
    J'espere avoir été clair.

    Jérémy

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Une jointure sera plus simple qu'une imbrication :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT nom_equipe, COUNT(DISTINCT Service_vendu) as Nb_Services
    FROM Ventes V
      INNER JOIN Agents A ON V.ID_agents = A.ID_agents
    GROUP BY nom_equipe
    J'ai supposé que tu voulais compter le nombre de services différents vendus par chaque équipe. Si tu veux juste le nb de ventes de chaque équipe, tu peux remplacer mon COUNT(DISTINCT Service_vendu) par un COUNT(*).
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup pour ta réponse.
    La requete me fait planter phpmyadmin.
    Je la comprends mais je vois pas comment l'exploiter.

    Le resultat de ma requete doit me renvoyer tout simplement un chiffre de type entier qui corresponds au nombre de services de type B par exemple vendu par une équipe.

    Je vais bien finir par trouver mais une aide de plus serait appréciée.

    De plus peux tu me donner un lien avec une aide sur "AS" ?

    Tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT nom_equipe, COUNT(DISTINCT Service_vendu) AS Nb_Services
    FROM Ventes V
    nom_equipe ne se trouve pas dans la table Ventes mais dans Agents

    Merci

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par djedje13 Voir le message
    Merci beaucoup pour ta réponse.
    La requete me fait planter phpmyadmin.
    Que veut dire "fait planter" ? un message d'erreur, aucun résultat, un écran qui se gèle ?
    Citation Envoyé par djedje13 Voir le message
    Je la comprends mais je vois pas comment l'exploiter.

    Le resultat de ma requete doit me renvoyer tout simplement un chiffre de type entier qui corresponds au nombre de services de type B par exemple vendu par une équipe.
    Ma requête te donne, pour chaque équipe, le nombre de services différents qu'elle a vendu. Donc si on limite aux services de type B, le nombre sera forcément 1 (ou zéro).
    Je crois comprendre que ce que tu veux c'est le nombre de ventes ?
    Citation Envoyé par djedje13 Voir le message
    Je vais bien finir par trouver mais une aide de plus serait appréciée.

    De plus peux tu me donner un lien avec une aide sur "AS" ?
    AS est facultatif et permet de donner un alias (un autre nom) à une colonne (ou à une table, mais je ne l'ai pas utilisé comme ça).

    Extrait de la doc MySQL :

    Une expression SELECT peut recevoir un alias en utilisant AS. L'alias est utilisé de la même fa¸on que le nom du champ et peut être employé avec des clauses ORDER BY ou HAVING. Par exemple :

    mysql> SELECT CONCAT(last_name,', ',first_name) AS full_name
    FROM mytable ORDER BY full_name;
    Le mot clé AS est optionnel lors de la création d'un alias pour une expression SELECT. L'exemple précédent aurait pu être écrit comme ceci :

    mysql> SELECT CONCAT(last_name,', ',first_name) full_name
    FROM mytable ORDER BY full_name;
    Comme AS est optionnel, un problème subtil peut survenir si vous oubliez une virgule entre deux expressions de SELECT : MySQL va interpréter la seconde comme un alias de la première. Par exemple, dans la commande suivante, columnb est traité comme un nom d'alias :

    mysql> SELECT columna columnb FROM mytable;
    Citation Envoyé par djedje13 Voir le message
    Tu écris :
    SELECT nom_equipe, COUNT(DISTINCT Service_vendu) AS Nb_Services
    FROM Ventes V
    nom_equipe ne se trouve pas dans la table Ventes mais dans Agents

    Merci
    Si tu regardes la ligne suivante, tu y verras que je jointure Ventes sur Agents.

    A l'évidence, tu as besoin d'apprendre ce qu'est une jointure, je t'invite donc à un peu de lecture... par exemple ce tuto, appliqué à MySQL : http://cyberzoide.developpez.com/php4/mysql/
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  5. #5
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Ca fait planter c'est a dire Impossible d'afficher la page dans phpmyadmin.

    En effet ce que je veux c'est le nombre de vente du service B pour une équipe sachant que je n'ai que l'ID des agents dans la table vente ...
    La jointure m'a l'air d'etre la bonne methode, j'ai également regarder les union ..


    Ma requete doit au final retourner un entier ..

    Merci de ton implication

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT COUNT(*) AS Nb_Ventes
    FROM Ventes V
      LEFT JOIN Agents A ON V.ID_agents = A.ID_agents
    WHERE A.nom_equipe = 'Equipe A'
      AND V.Service_vendu = 'Service B'
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  7. #7
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Merci 1000 Fois ca fonctionne nickel !!!!
    Encore merci

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    En fait ça ne gère pas correctement le cas où il n'y a pas de ventes...

    Si tu veux avoir un zéro, il faut faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT COUNT(*) AS Nb_Ventes
    FROM Ventes V
      LEFT JOIN Agents A ON V.ID_agents = A.ID_agents AND V.Service_vendu = 'Service B'
    WHERE A.nom_equipe = 'Equipe A'
    Si ne pas avoir de résultat te suffit, cette requête-ci ira plus vite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT COUNT(*) AS Nb_Ventes
    FROM Ventes V
      INNER JOIN Agents A ON V.ID_agents = A.ID_agents 
    WHERE A.nom_equipe = 'Equipe A'
      AND V.Service_vendu = 'Service B'
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  9. #9
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    La requête a super bien fonctionnée mais je voudrais faire un petit plus :

    Je voudrais afficher un tableau qui affiche :
    Le prenom de l'agent dans la premiere colone.
    Le nombre de vente effectué par l'agent pour le service A dans une seconde collone
    Le nombre de vente effectué par l'agent pour le service B dans une troisieme collone

    etc ...

    Prenom SERVICE A SERVICE B

    Marc 12 25
    Pierre 2 10
    TOTAL 14 35


    j'arrive a faire le total de chaque agent mais a bien l'ordonné c'est pas évident.
    Peut etre existe t'il une requete plus simple ou une méthode plus simple ?

    Merci encore

  10. #10
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par djedje13 Voir le message
    j'arrive a faire le total de chaque agent mais a bien l'ordonné c'est pas évident.
    Peut etre existe t'il une requete plus simple ou une méthode plus simple ?
    Comment fais-tu le total de chaque agent ?
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  11. #11
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    je fais appel a cette fuction :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    function requete($agent , $service, $date_start, $date_end )
    {
            require ("params.inc.php");
            $connexion= mysql_connect($hote,$login,$mdp);
            mysql_select_db($bd, $connexion);
            $user = $_COOKIE['username'];
            $date_start = $_GET['date_start'];
            $date_end = $_GET['date_end'];
            $req="SELECT COUNT(*) FROM logs WHERE type='$service' AND user='$agent' AND (timestamp BETWEEN '$date_start' AND '$date_end')";
            $result=mysql_query($req,$connexion);
    //      $retourneval =mysql_result($result);
            return mysql_result($result,0);
            echo "$req";
    //      return $retourneval;
     
    }

    mais elle me retourne de mauvais resultat, j'ai fais un echo de la requete pour voir si elle etait bonne et elle est bonne !

    $agents est obtenu avec un mysql_fetch_array de ma table Agents ...

  12. #12
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par djedje13 Voir le message
    $agents est obtenu avec un mysql_fetch_array de ma table Agents ...
    Je suppose que tu veux parler de $agent... ça veut dire que tu fais une première requête qui te donne la liste des agents, et qu'ensuite tu refais une requête pour chaque agent ? Si c'est bien ça, c'est une très mauvaise idée ! Les SGBD sont optimisés pour traiter les données en masse, une grosse requête est donc généralement bcp plus rapide que plusieurs petites.

    Sinon, pourquoi utilises-tu la table logs plutôt que Ventes ? Quelle est la structure de cette table ?
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/02/2014, 10h16
  2. Réponses: 2
    Dernier message: 13/04/2012, 20h18
  3. Réponses: 6
    Dernier message: 29/02/2012, 08h00
  4. [XL-2003] Tester si une valeur réapparait plusieurs fois dans une cellule
    Par apnw7931 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/04/2011, 15h10
  5. Réponses: 9
    Dernier message: 08/10/2010, 08h39

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