Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/05/2011, 11h40   #1
Invité régulier
 
Inscription : septembre 2010
Messages : 31
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 31
Points : 9
Points : 9
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 :
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 :

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.
Vict0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2011, 15h33   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 954
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 954
Points : 17 774
Points : 17 774
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
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2011, 16h18   #3
Invité régulier
 
Inscription : septembre 2010
Messages : 31
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 31
Points : 9
Points : 9
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 :
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 :
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.
Vict0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2011, 00h44   #4
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 954
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 954
Points : 17 774
Points : 17 774
É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 :
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
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2011, 12h54   #5
Invité régulier
 
Inscription : septembre 2010
Messages : 31
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 31
Points : 9
Points : 9
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 :
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.
Vict0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2011, 22h03   #6
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
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.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2011, 23h18   #7
Invité régulier
 
Inscription : septembre 2010
Messages : 31
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 31
Points : 9
Points : 9
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 !
Vict0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 07h25   #8
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
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 :
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.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 11h37   #9
Invité régulier
 
Inscription : septembre 2010
Messages : 31
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 31
Points : 9
Points : 9
Merci pour cette astuce.
Vict0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h16.


 
 
 
 
Partenaires

Hébergement Web