Bonjour, je bloque sur un problème qui doit être tout bête, car j'ai deux requête qui fonctionnent parfaitement l'une après l'autre mais des que je les 'lient' ça me renvoit un mauvais résultat. (le résultat renvoyé sur mes colonnes nb_article et nombre_commentaire, est le résultat multiplié par deux de la colonne nombre_commentaire)
La base de donnée se trouve ici : http://exercices.openclassrooms.com/assessment/223?id=1959476&slug=administrez-vos-bases-de-donnees-avec-mysql&login=7768139&tk=b158f7260d792e119265d4d0c8575840&sbd=2016-02-01&sbdtk=2466d6bae51e373d89ac8e3f74213199
# Mes deux requêtes qui marchent
SELECT Utilisateur.id, COUNT(Commentaire.auteur_id) AS nombre_commentaire, MAX(Commentaire.date_commentaire) AS date_dernier_commentaire
FROM Utilisateur
LEFT JOIN Commentaire ON Utilisateur.id = Commentaire.auteur_id
GROUP BY Utilisateur.id;
SELECT Utilisateur.id, COUNT(Article.auteur_id) AS nb_article, MAX(date_publication) AS date_dernier_article
FROM Utilisateur
LEFT JOIN Article ON Utilisateur.id = Article.auteur_id
GROUP BY Utilisateur.id;
# Ma requête qui ne marche pas
SELECT Utilisateur.id, COUNT(Article.auteur_id) AS nb_article, MAX(date_publication) AS date_dernier_article
SELECT COUNT(Commentaire.id) AS nombre_commentaire, MAX(Commentaire.date_commentaire) AS date_dernier_commentaire
FROM Utilisateur
LEFT JOIN Article ON Utilisateur.id = Article.auteur_id
LEFT JOIN Commentaire ON Utilisateur.id = Commentaire.auteur_id
GROUP BY id;
Qu'est-ce que tu appelles "un mauvais résultat" ? Tu fais des jointures externes, ce n'est peut-être pas ce que tu attends, mais c'est sans doute ce que tu demandes.
Si j'utilise LEFT JOIN c'est parce que je veux garder toutes les données de la colonne id
# Et ça me retourne un mauvais résultat parce que, quand je fais mes deux requêtes séparées ça me donne ce résultat :
PREMIERE REQUETE :
SELECT Utilisateur.id, COUNT(Commentaire.auteur_id) AS nombre_commentaire, MAX(Commentaire.date_commentaire) AS date_dernier_commentaire
-> FROM Utilisateur
-> LEFT JOIN Commentaire ON Utilisateur.id = Commentaire.auteur_id
-> GROUP BY Utilisateur.id;
+----+--------------------+--------------------------+
| id | nombre_commentaire | date_dernier_commentaire |
+----+--------------------+--------------------------+
| 1 | 3 | 2014-11-23 07:44:33 |
| 2 | 2 | 2014-11-24 08:47:15 |
| 3 | 0 | NULL |
| 4 | 1 | 2014-11-10 05:06:47 |
+----+--------------------+--------------------------+
DEUXIEME REQUETE :
SELECT Utilisateur.id, COUNT(Article.auteur_id) AS nb_article, MAX(date_publication) AS date_dernier_article
-> FROM Utilisateur
-> LEFT JOIN Article ON Utilisateur.id = Article.auteur_id
-> GROUP BY Utilisateur.id;
+----+------------+----------------------+
| id | nb_article | date_dernier_article |
+----+------------+----------------------+
| 1 | 2 | 2014-10-24 16:38:23 |
| 2 | 2 | 2014-10-28 07:50:25 |
| 3 | 2 | 2014-10-30 22:25:30 |
| 4 | 2 | 2014-10-11 16:50:17 |
Mes deux requêtes en une seule :
SELECT Utilisateur.id, COUNT(Article.auteur_id) AS nb_article, MAX(date_publication) AS date_dernier_article,
-> COUNT(Commentaire.id) AS nombre_commentaire, MAX(Commentaire.date_commentaire) AS date_dernier_commentaire
-> FROM Utilisateur
-> LEFT JOIN Article ON Utilisateur.id = Article.auteur_id
-> LEFT JOIN Commentaire ON Utilisateur.id = Commentaire.auteur_id
-> GROUP BY id;
+----+------------+----------------------+--------------------+--------------------------+
| id | nb_article | date_dernier_article | nombre_commentaire | date_dernier_commentaire |
+----+------------+----------------------+--------------------+--------------------------+
| 1 | 6 | 2014-10-24 16:38:23 | 6 | 2014-11-23 07:44:33 |
| 2 | 4 | 2014-10-28 07:50:25 | 4 | 2014-11-24 08:47:15 |
| 3 | 2 | 2014-10-30 22:25:30 | 0 | NULL |
| 4 | 2 | 2014-10-11 16:50:17 | 2 | 2014-11-10 05:06:47 |
+----+------------+----------------------+--------------------+--------------------------+
Je sais que l'erreur se trouve au niveau de mes jointures (j'ai découpé plusieurs fois ma commande pour savoir ou ça buggais, mais impossible de savoir pourquoi ...)
Le problème vient des cardinalités... ce n'est pas un bug.
Un utilisateur pouvant avoir à la fois plusieurs articles ET plusieurs commentaires, ta requête retourne tous les couples article/commentaire possible...
Un utilisateur ayant 2 articles et 3 commentaires retournera 6 lignes...
Pour comprendre retire les COUNT et le GROUP BY, et laisse article_id et commmentaire_id et regarde le résultat.
Ici il n'y a pas d'autre solution que de faire deux requêtes ou au moins deux sous-requetes (ou deux vues)...
× 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.
N'oubliez pas d'activer les erreurs PDO.