Bonjour,
J'ai 3 tables : utilisateur, article (avec un utilisateur_id), commentaire (avec un utilisateur_id et article_id)
Bien entendu, un utilisateur n'a pas forcément un article ou un commentaire.
Si je fais la requête ci-dessous sur les articles, c'est Ok :
Si je fais la requête ci-dessous sur les commentaires, c'est Ok :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 DROP TEMPORARY TABLE IF EXISTS Auteur_TMP; -- Suppression de la table temporaire CREATE TEMPORARY TABLE Auteur_TMP ENGINE = InnoDB SELECT utilisateur.pseudo AS Auteur_Pseudo, -- pseudo de l'auteur COUNT(article.id) AS Articles_Nb -- Nombre d'articles FROM utilisateur -- Table des utilisateurs LEFT JOIN article ON article.auteur_id = utilisateur.id -- Jointure sur les articles GROUP BY utilisateur.id -- Regroupement par utilisateur ORDER BY utilisateur.pseudo ASC; -- Tri par pseudo d'utilisateur SELECT * FROM Auteur_TMP;
Par contre si je mets les 2 LEFT JOIN en même temps, les COUNT sont faux (et identiques entre articles et commentaires) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 DROP TEMPORARY TABLE IF EXISTS Auteur_TMP; -- Suppression de la table temporaire CREATE TEMPORARY TABLE Auteur_TMP ENGINE = InnoDB SELECT utilisateur.pseudo AS Auteur_Pseudo, -- pseudo de l'auteur COUNT(commentaire.id) AS Commentaires_Nb -- Nombre des commentaires FROM utilisateur -- Table des utilisateurs LEFT JOIN commentaire ON commentaire.auteur_id = utilisateur.id -- Jointure sur les commentaires GROUP BY utilisateur.id -- Regroupement par utilisateur ORDER BY utilisateur.pseudo ASC; -- Tri par pseudo d'utilisateur SELECT * FROM Auteur_TMP;
Voici la structure des tables :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 DROP TEMPORARY TABLE IF EXISTS Auteur_TMP; -- Suppression de la table temporaire CREATE TEMPORARY TABLE Auteur_TMP ENGINE = InnoDB SELECT utilisateur.pseudo AS Auteur_Pseudo, -- pseudo de l'auteur COUNT(article.id) AS Articles_Nb, -- Nombre d'articles COUNT(commentaire.id) AS Commentaires_Nb -- Nombre des commentaires FROM utilisateur -- Table des utilisateurs LEFT JOIN article ON article.auteur_id = utilisateur.id -- Jointure sur les articles LEFT JOIN commentaire ON commentaire.auteur_id = utilisateur.id -- Jointure sur les commentaires GROUP BY utilisateur.id -- Regroupement par utilisateur ORDER BY utilisateur.pseudo ASC; -- Tri par pseudo d'utilisateur SELECT * FROM Auteur_TMP;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 -- Création des tables DROP Table IF EXISTS Article CREATE TABLE Article ( id INT UNSIGNED AUTO_INCREMENT, titre VARCHAR(200) NOT NULL, resume TEXT, contenu TEXT NOT NULL, auteur_id INT UNSIGNED NOT NULL, date_publication DATETIME NOT NULL, PRIMARY KEY(id) ); DROP Table IF EXISTS Utilisateur CREATE TABLE Utilisateur ( id INT UNSIGNED AUTO_INCREMENT, pseudo VARCHAR(100) NOT NULL, email VARCHAR(200) NOT NULL, password CHAR(40) NOT NULL, -- le mot de passe sera hashé avec sha1, ce qui donne toujours une chaîne de 40 caractères PRIMARY KEY(id) ); DROP Table IF EXISTS Commentaire CREATE TABLE Commentaire ( id INT UNSIGNED AUTO_INCREMENT, article_id INT UNSIGNED NOT NULL, auteur_id INT UNSIGNED, contenu TEXT NOT NULL, date_commentaire DATETIME NOT NULL, PRIMARY KEY(id) );
Est-ce que quelqu'un a une idée ?
Merci d'avance
Partager