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

PostgreSQL Discussion :

Migrations MySQL vers PostgreSQL : Erreur lors d'un SELECT


Sujet :

PostgreSQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 31
    Points : 19
    Points
    19
    Par défaut Migrations MySQL vers PostgreSQL : Erreur lors d'un SELECT
    Bonjour,

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    pg_query("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") or die(pg_result_error());
    Voici l'erreur qui est retournée :

    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.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 766
    Points : 52 563
    Points
    52 563
    Billets dans le blog
    5
    Par défaut
    C'est normal, MySQL est une vrai passoire et laisse des requêtes sciemment fausses sans complexe donnant des résultats souvent faux.

    Commencez par apprendre le langage SQL, et notamment le principe du GROUP BY :
    1 - La présence de la clause GROUP BY est nécessaire dès que la clause de sélection, ou le filtre WHERE, ou encore les jointures comportent simultanément des calculs d'agrégation et la présence de colonnes de table hors de calculs d'agrégation.
    2 - De plus, toutes les colonnes représentées hors des calculs d'agrégation doivent figurer dans la clause GROUP BY.

    A lire : http://sqlpro.developpez.com/cours/sqlaz/ensembles/

    De ce fait vous devez impérativement mettre dans votre GROUP BY toutes les colonnes, sauf celles agrégées !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    Merci d'avoir pris le temps de me répondre.
    J'ai suivi vos conseils en ésperant ne pas avoir fait d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    "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
    GROUP BY 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, id_juge";
    Je n'ai plus de message d'erreur venant de PHP mais le résultat provenant de la requête est vide.

    Pourtant quand je vérifie dans ma table article, il y a bien un article qui correspond et un membre aussi.

    Qu'en pensez-vous ?

    Edit : On m'a proposé une solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    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 aucune erreur, mais la requête ne retourne pas de résultat.

    Merci.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 766
    Points : 52 563
    Points
    52 563
    Billets dans le blog
    5
    Par défaut
    Évitez d'utiliser le USING pour les jointures (comme le NATURAL JOIN). Ce sont des gadget pour benêt ! On se sait pas sur quelle table il va faire les jointures. En supposant par exemple que votre colonne existe dans trois tables, comment résoud-il le USING ?
    Bref, soyez clair net et précis, mettez des prédicat de jointure avec ON et précisez la provenance de toutes vos colonnes avec des alias de table.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    FROM article AS A
      JOIN membre AS M 
             ON A.id_membre = M.id_membre
      JOIN (SELECT id_article, id_juge, count(*) AS nombre_notes 
            FROM   note_article GROUP BY id_article, id_juge) AS N 
             ON ??? = N.id_article
    WHERE id_article = ".$IdArticle
    Bref, apprenez SQL. Mon livre comme mon site web peuvent vous y aider...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

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

    Voici ce que j'ai tenté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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.

  6. #6
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Seulement, l'index NombreNote n'existe pas
    L'index??? quid? Vous voulez dire la colonne ici de la sous requête ayant pour alias N?

    Je ne comprends pas pourquoi vous dites qu'elle n'existe pas? elle n'est pas présente dans le SELECT principal...

    Ceci dis elle sera à NULL si vous l'y ajoutez puisque note_article est vide...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    Bonsoir,

    Dans ma requête SQL, je souhaite avoir le nombre de vote pour l'article. il s'agit de "N".

    Si le résultat est NULL, mon script en PHP affichera 0. Sinon il affichera la valeurs retournée par la requête.

    Vous m'avez mis la puce à l'oreille, grâce à votre post, j'ai eu l'idée d'ajouter N.NombreNote au SELECT principal de ma requête.

    Problème résolu !

  8. #8
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Si le résultat est NULL, mon script en PHP affichera 0. Sinon il affichera la valeurs retournée par la requête.

    Vous pouvez aussi faire ceci dans votre SELECT:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT ....,COALESCE(NombreNote ,0) AS NombreNote 
    FROM ...

    Ce qui vous évite d'avoir des NULL dans NombreNote... vous aurez directement 0 à la place.
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    Merci pour cette astuce.

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

Discussions similaires

  1. [PostgreSQL] Migration d'un site web de MySQL vers PostgreSql
    Par zozotitou dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 22/01/2014, 17h26
  2. migration d'un bdd mysql vers postgresql
    Par misseva3105 dans le forum Installation, migration et administration
    Réponses: 1
    Dernier message: 20/01/2011, 10h36
  3. migration de mysql vers postgresql
    Par ANISSS dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 18/05/2007, 15h19
  4. [SGBD] Migration de mysql vers PostgreSQL ?
    Par haffouff dans le forum SQL Procédural
    Réponses: 12
    Dernier message: 25/05/2006, 15h29
  5. Migrer de MySQL vers PostgreSQL
    Par Acti dans le forum PostgreSQL
    Réponses: 9
    Dernier message: 25/02/2005, 14h20

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