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 :

Group by ne fonctionne pas, pourquoi ? [MySQL-5.5]


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2020
    Messages : 2
    Par défaut Group by ne fonctionne pas, pourquoi ?
    Bonjour,
    Je n'arrive pas à obtenir le résultat désiré, du coup je fais appel à votre aide.
    J'ai 2 tables
    - Table Product (id_Product, id_feature, id_feature_value)
    - Table Feature (id_feature_value, value)

    Si j'exécute la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select
    	id_product AS 'produit',
    	IF (id_feature = 1, value, null) as 'valeur1',
    	IF (id_feature = 2, value, null) as 'valeur2',
    FROM `Product` P, `Feature` F
    Where id_product = 1
    And P.id_feature_value = F.id_feature_value
    J'obtiens :

    produit valeur1 valeur2
    1 null date_2
    1 date_1 null

    Je veux avoir le résultat suivant :

    produit valeur1 valeur2
    1 date_1 date_2

    Du coup, je rajoute un group by produit, mais j'obtiens uniquement la première ligne :

    produit valeur1 valeur2
    1 null date_2

    J'ai dû louper un truc, mais je ne comprends pas quoi

    Encore merci pour votre aide

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 552
    Par défaut
    Bonjour,
    Il nous faudrait un jeu de test, mais je pense savoir d'où vient le "problème".
    Si pour un produit donné j'ai deux factures, id_facture = 1 et id_facture = 2, la requête va renvoyer 2 lignes, une par facture.
    Pour la "première" ligne id_facture vaut 1, donc la troisième colonne est à null (la condition n'est pas vérifiée).
    Idem pour la "deuxième" ligne, id_facture vaut 2, donc la deuxième colonne est à null.

    Il suffit d'ajouter id_feature dans le SELECT pour le vérifier.
    Si tu ne veux que 2 factures pour un produit, à mon avis il faut faire 2 jointures.
    Un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select p.id,c1.caleur,c2.valeur
    from produit as as p
    left outer join commande as c1 on c1.id_produit = p.id and c1.colx = 1
    left outer join commande as c2 on c2.id_produit = p.id and c2.colx = 2
    Reste à vérifier si tu dois utiliser des jointures internes ou externes.

    Ajouter un GROUP BY à la requête sans rien modifier ne devrait pas fonctionner, car tu n'applique pas de fonction d'agrégation (MIN,MAX...) sur les autres colonnes.
    Seul MySql laisse passer, mais tu ne sais pas ce qui va être renvoyé pour ces colonnes.

    Tatayo.

    P.S. tu devrait utiliser l'opérateur JOIN pour tes requête, elles seront bien plus faciles à lire, surtout quand le nombre de tables impliquées augmente.

  3. #3
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 552
    Par défaut
    Ton problème me trottait dans la tête, et je me suis souvenu du pivot avec Mysql.
    Regarde , je pense que c'est ce que tu cherches à faire.

    Reste à voir si c'est disponible avec ta version de MySql.

    Tatayo.

  4. #4
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2020
    Messages : 2
    Par défaut
    Bonjour Tatayo,
    tout d'abord, merci pour ton aide.
    j'ai testé les 2 méthodes, la première avec les 2 jointures, me donne exactement le même résultat avec 2 lignes différentes.
    La seconde, avec l'utilisation du GROUP_CONCAT donne le résultat espéré et fonctionne avec ma version de mysql

    Trop fort Tatayo

    Encore merci pour ton aide, je passe le sujet à résolu.
    Bonne soirée.

  5. #5
    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
    Par défaut
    Bonjour,


    A partir de votre requête initiale, après ajout du GROUP BY, il faut utiliser une fonction d’agrégation (qui éliminera les NULL). Il s'agit d'un pivot "à l'ancienne" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select
    	id_product AS 'produit',
    	MAX(IF (id_feature = 1, value, null)) as 'valeur1',
    	MAX(IF (id_feature = 2, value, null)) as 'valeur2',
    FROM `Product` P, `Feature` F
    Where id_product = 1
    And P.id_feature_value = F.id_feature_value
    GROUP BY id_product

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 17/09/2009, 15h08
  2. un simple exemple qui ne fonctionne pas! pourquoi ?
    Par clavier12AZQSWX dans le forum Flex
    Réponses: 1
    Dernier message: 17/08/2009, 16h50
  3. RTRIM ne fonctionne pas, pourquoi ?
    Par bytof dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 03/10/2008, 11h53
  4. Group by ne fonctionne pas
    Par webfranc dans le forum SQL
    Réponses: 10
    Dernier message: 07/05/2008, 14h30
  5. [SQL_SERVER_2K] mon truncate ne fonctionne pas, pourquoi ?
    Par MeHo_ dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 21/03/2008, 20h19

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