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 :

Manipulation d'un requete SQL avec GROUP BY


Sujet :

MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 145
    Points : 59
    Points
    59
    Par défaut Manipulation d'un requete SQL avec GROUP BY
    Bonjour,

    j'essaie de passer une requête GROUP BY mais le résultat ne s'affiche pas comme je le souhaite.

    La requête consiste à connaître toutes les personnes qui ont appelées plusieurs fois (numero, nb_appel) et ensuite avoir le détail de l'appel (id, date). Pour le moment, je regroupe bien par appelant mais je n'arrive à afficher le détail des appels.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT a.numero, COUNT(a.id) as 'nb_appel', a.id, a.date
    FROM appels a
    GROUP BY a.numero
    HAVING nb_appel > 1
    ORDER BY nb_appel
    Résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    0652787612 / 2 / 33620 / 2015-02-23 15:28:52
    0467913314 / 2 / 25444 / 2015-02-02 09:21:45
    J'aimerais avoir tous les appels comme ceci en doublonnant les 2 premières colonnes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    0652787612 / 2 / 33620 / 2015-02-23 15:28:52
    0652787612 / 2 / 33627 / 2015-02-23 16:10:12
    0467913314 / 2 / 25444 / 2015-02-02 09:21:45
    0467913314 / 2 / 25449 / 2015-02-02 10:45:35
    Est-ce possible selon vous ?

    A+

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Si vous groupez par numéro, alors vous n'aurez qu'une ligne par numéro !

    pour avoir le détail de chaque appel, vous pouvez soit faire une sous requete pour connaitre les numéros ayant appelé plusieurs fois, soit utiliser une clause EXISTS pour trouver les appels pour lesquels il existe un autre appel avec le même numéro.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 145
    Points : 59
    Points
    59
    Par défaut
    Merci beaucoup pour la piste.
    Par contre je vois pas trop comment tourner la requête EXISTS pour arriver à mes fins ? une idée ?

  4. #4
    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
    1) Toutes les colonnes du SELECT ne faisant pas l'objet d'une fonction de groupage doivent figurer dans le GROUP BY sous peine de voir des valeurs aléatoires pour les colonnes manquantes. MySQmerde est trop permissif sur le GROUP BY. Un autre SGBD aurait refusé votre requête.

    2) 'date' est un mauvais nom de colonne car c'est un mot réservé du langage SQL.

    3) Nommez vos tables au singulier car elles sont issues des règles de gestion qui décrivent ce qui se passe successivement pour 1 ligne de chaque table.



    Passons à votre problème...

    1) Quels sont les numéros ayant été appelés plus d'une fois ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT numero, COUNT(*) AS nb_appels
    FROM appels
    GROUP BY numero
    HAVING COUNT(*) > 1
    2) Quels sont tous les appels passés à ces numéros ?
    => On fait une jointure entre la table et la requête précédente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT a.numero, a.id, a.`date`
    FROM appels a
    INNER JOIN
    (
    	SELECT numero, COUNT(*) AS nb_appels
    	FROM appels
    	GROUP BY numero
    	HAVING COUNT(*) > 1
    ) tmp
    	ON tmp.numero = a.numero
    ORDER BY tmp.nb_appels, a.numero
    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 !

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 145
    Points : 59
    Points
    59
    Par défaut
    Ouah la classe.
    Merci pour les infos également.

  6. #6
    Membre émérite
    Homme Profil pro
    tripatouilleur de code pour améliorer mon quotidien boulistique
    Inscrit en
    Février 2008
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : tripatouilleur de code pour améliorer mon quotidien boulistique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2008
    Messages : 939
    Points : 2 287
    Points
    2 287
    Par défaut
    Bonjour

    Oui, avec Philippe c'est la classe, il maîtrise super bien le SQL, connaît bien MySQL, même si il ne supporte pas ses gros défauts.

    Ce que j'aime chez lui, c'est sa capacité à expliquer le cheminement dans la création de requêtes complexes. Cette faculté de faire les choses étape par étape.
    Grâce à cela j'ai enfin compris les sous requête, et pu m'en servir.
    Donc merci encore Philippe.

    ATTENTION!
    Il y a d'autres contributeurs très performants, chacun avec leur personnalité, et j'apprends à (profresser) progresser avec chacun d'eux!!

    Pierre

  7. #7
    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
    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 !

Discussions similaires

  1. Requete SQL avec GROUP BY et HAVING
    Par breynard dans le forum Langage SQL
    Réponses: 7
    Dernier message: 19/11/2009, 11h56
  2. REQUETE SQL AVEC HAVING
    Par juju_77 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 05/08/2005, 09h49
  3. Probleme de requete SQL avec un champs date
    Par ju360modena dans le forum ASP
    Réponses: 5
    Dernier message: 16/06/2005, 11h18
  4. [JDBC] retour de requete sql avec valeur NULL
    Par maxxou dans le forum JDBC
    Réponses: 3
    Dernier message: 13/09/2004, 14h40

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