Partage
  • Partager sur Facebook
  • Partager sur Twitter

Migrations MySQL vers PostgreSQL : Erreur lors d'un SELECT

Sujet résolu
    28 mai 2011 à 15:18:53

    Bonjour,

    J'effectue en ce moment une migration de MySQL vers PostgreSQL et j'ai quelques difficultés avec cette requête :

    SELECT membre.id_membre, article.id_article, photo_membre, pseudo_membre, titre_article, contenu_article, categorie_article, 
    occasion_article, tranche_age_article, sexe_article, licence_article, parution_article, vision_article, COUNT(id_note) AS NombreNote, id_juge
    FROM article, membre, note_article
    WHERE article.id_article = ".$IdArticle."
    AND article.id_article = note_article.id_article
    AND membre.id_membre = article.id_membre";
    


    Voici l'erreur qui est retournée :

    Citation

    Warning: pg_query() [function.pg-query]: Query failed: ERREUR: la colonne « membre.photo_membre » doit apparaître dans la clause GROUP BY ou doit être utilisé dans une fonction d'agrégat LINE 1: SELECT membre.id_membre, article.id_article, photo_membre, p... ^



    Même si j'ajoute le GROUP BY à id_membre j'ai le même message avec les autres champs de ma requête.

    membre.id_membre est la clé primaire de la table membre
    article.id_article est la clé primaire de la table article

    Merci de m'aider. :)
    • Partager sur Facebook
    • Partager sur Twitter
      28 mai 2011 à 19:53:05

      Ta requête n'est pas valide sous d'autres SGBDR que MySQL. MySQL traduit ta requête par quelque chose comme "Sélectionne le nombre de lignes que ta requête renvoie, et plein d'autres colonnes au hasard dans le paquet". Comme ça n'a absolument aucun sens, PostgreSQL n'accepte pas ta requête.

      Quand tu utilises une fonction d'agrégat, tu dois utiliser GROUP BY sur toutes les autres colonnes que tu sélectionnes. Sinon, ta requête n'a aucun sens.
      • Partager sur Facebook
      • Partager sur Twitter
        28 mai 2011 à 19:56:15

        Le GROUP BY non-standard de MySQL est ... non-standard. Parfois très pratique, parfois une bonne source de bugs...

        Comme id_article est unique dans ton résultat avant le GROUP BY, là, on est dans le cas "pratique".

        Pour postgres, essaie ça :

        SELECT membre.id_membre, article.id_article, photo_membre, pseudo_membre, 
        titre_article, contenu_article, categorie_article, 
        occasion_article, tranche_age_article, sexe_article, 
        licence_article, parution_article, vision_article, 
        nombre_notes, id_juge
        
        FROM article
          JOIN membre USING (id_membre)
          JOIN (SELECT id_article, count(*) AS nombre_notes FROM note_article GROUP BY id_article) n USING (id_article)
        WHERE id_article = $IdArticle
        


        Normalement postgres pousse la condition id_article = $IdArticle dans la sous-requête. Pour des conditions plus complexes une requête WITH résoud le problème.
        • Partager sur Facebook
        • Partager sur Twitter
          28 mai 2011 à 21:06:21

          J'ai parlé un peu vite, je modifie mon post.
          J'ai du modifié un peu la requête proposé :

          SELECT membre.id_membre, id_article, photo_membre, pseudo_membre, 
          titre_article, contenu_article, categorie_article, 
          occasion_article, tranche_age_article, sexe_article, 
          licence_article, parution_article, vision_article, 
          nombre_notes
          
          FROM article
            JOIN membre USING (id_membre)
            JOIN (SELECT id_article, id_juge, count(*) AS nombre_notes FROM note_article GROUP BY id_article, id_juge) n USING (id_article)
          WHERE id_article = ".$IdArticle
          


          Je n'ai plus d'erreur mais aucun résultat ne s'affiche. :o
          Merci de m'aider. ;)
          • Partager sur Facebook
          • Partager sur Twitter
            28 mai 2011 à 22:54:25

            La table note_article contient bien des trucs ?

            Remplace le 2è JOIN par un LEFT JOIN pour voir.

            • Partager sur Facebook
            • Partager sur Twitter
              28 mai 2011 à 23:05:04

              Non le contenu est vide dans la table note_article. :)
              • Partager sur Facebook
              • Partager sur Twitter
                28 mai 2011 à 23:17:33

                Si elle est vide, avec une jointure simple, c'est normal que rien ne s'affiche.
                • Partager sur Facebook
                • Partager sur Twitter
                  29 mai 2011 à 0:02:32

                  Le problème c'est qu'aucun autre champ ne s'affiche. :/

                  Quel type de jointure pourrait résoudre ce problème ?

                  Merci de m'aider en tout cas. ;)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    29 mai 2011 à 0:12:22

                    Citation : Lord Casque Noir

                    Si elle est vide, avec une jointure simple, c'est normal que rien ne s'affiche.



                    Citation : Lord Casque Noir

                    La table note_article contient bien des trucs ?

                    Remplace le 2è JOIN par un LEFT JOIN pour voir.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      29 mai 2011 à 11:17:41

                      Salut,

                      J'avais oublié de précisé que j'avais utilisé LEFT JOIN mais il n'y a eu aucun changement. :(

                      Merci. ;)

                      Edit :

                      Ce matin j'ai lu quelques articles sur SQLPro entres autres les jointures SQL

                      Voici ce que j'ai tenté :

                      SELECT 	article.id_article, titre_article, contenu_article, categorie_article, occasion_article, tranche_age_article, 
                      	sexe_article, licence_article, parution_article, vision_article,
                      	article.id_membre, pseudo_membre, sexe_membre, photo_membre
                      FROM 	article
                      JOIN 	membre ON article.id_membre = membre.id_membre
                      LEFT OUTER JOIN (
                      	SELECT note_article.id_article, id_juge, COUNT(*) AS NombreNote 
                      	FROM note_article GROUP BY id_article, id_juge) AS N 
                      	ON article.id_article = N.id_article
                      WHERE 	article.id_article = $IdArticle;
                      


                      En utilisant la fonction print_r() sur mysql_fetch_assoc() la requête retourne bien des résultats.

                      Seulement, l'index NombreNote n'existe pas.
                      Je précise que la table note_article est vide.

                      Merci.

                      Edit 2 :

                      J'ai rajouté N.NombreArticle dans le premier SELECT et c'est réglé ! :)
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Migrations MySQL vers PostgreSQL : Erreur lors d'un SELECT

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown