Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Cours] Administrez vos BDD avec MySQL

1 septembre 2017 à 10:59:21

Je n'ai pas trop compris @Benzouye quand tu me dis d'initialiser ma colonne, c'est à dire que je j'attribue à la main le nombre de commentaire qui se trouve sur chaque article ?

Voilà ce que j'obtiens en essayant ta requête : 

Alors que je suis censé obtenir : 

Du coup je ne comprend pas pourquoi pas procédure (dans mon ancien commentaire) ne fonctionne pas, alors que j'ai la même chose,

un "COUNT(id) FROM commentaire GROUP BY Article_id" 

:/

  • Partager sur Facebook
  • Partager sur Twitter
1 septembre 2017 à 11:01:18

Voili voilou ;)

THX

mysql> INSERT INTO Animal (sexe, date_naissance, nom, commentaires,espece_id) VALUES ('F', '2008-02-20 15:45:00', 'Canaille', NULL, 1);
Query OK, 1 row affected (0.04 sec)

mysql> select * from Animal;
+----+------+---------------------+----------+--------------+-----------+---------+---------+---------+
| id | sexe | date_naissance      | nom      | commentaires | espece_id | race_id | mere_id | pere_id |
+----+------+---------------------+----------+--------------+-----------+---------+---------+---------+
|  3 | F    | 2008-02-20 15:45:00 | Canaille | NULL         |         1 |    NULL |    NULL |    NULL |
+----+------+---------------------+----------+--------------+-----------+---------+---------+---------+
1 row in set (0.00 sec)

mysql> 



  • Partager sur Facebook
  • Partager sur Twitter
1 septembre 2017 à 11:27:23

CharlyLerenard1 a écrit:

Voilà ce que j'obtiens en essayant ta requête

C'est normal ... j'ai oublié la condition de jointure :p

UPDATE article A
INNER JOIN (
    SELECT article_id, COUNT(*) AS nb_comment
    FROM commentaire
    GROUP BY article_id
) C
ON A.id = C.article_id
SET A.nbre_de_comm = C.nb_comment;

Avec cela ta colonne devrait bien être initialisée ...

CharlyLerenard1 a écrit:

Du coup je ne comprend pas pourquoi pas procédure (dans mon ancien commentaire) ne fonctionne pas, alors que j'ai la même chose

Non, pas vraiment ... Ton erreur est induite par le comportement de MySQL avec le GROUP BY (cf. cet article pour plus de détail). Regarde le résultat de la requête de ton curseur, c'est juste une liste de nombres entiers avec autant d'enregistrements que tu as d'articles avec commentaire, mais sans lien avec l'article_id ... Ensuite tu mets à jour la table article sans savoir de quel article provient le décompte de commentaires ...

Dans ton contexte, pas besoin de procédure, ma requête suffit et c'est la jointure (que j'avais oublié) qui fait le lien ...

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
2 septembre 2017 à 18:11:27

Merci ça marche ! Seulement, peux tu me dire comment regarder le résultat de ma requête de mon curseur ? Parce que là ce n'est pas encore tout à fait clair la raison de cet échec :p 

  • Partager sur Facebook
  • Partager sur Twitter
2 septembre 2017 à 18:58:22

Exécutes simplement la requête SELECT seule :

SELECT COUNT(id)
FROM commentaire
GROUP BY Article_id

Selon ton premier post, c'est cette requête que tu utilisais pour ton curseur ... Elle doit  te retourner un truc du genre :

COUNT(id)
3
1
2
2
0
1
2
0

 Et tu boucles là-dessus ... Pour lancer un UPDATE ... Chelou non sans Article_id ? Rien ne te dit quel article concerne chacun des ces nombres ... Du coup le UPDATE me semble farfelu ...

-
Edité par Benzouye 2 septembre 2017 à 18:59:34

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
3 septembre 2017 à 12:51:44

Ahhh mais tu voulais dire que je récupérais le nombre de commentaire mais pas l'article_id dans ma procédure !!!! :o ???

Alalala j'étais si près du but !!! Du coup j'ai rajouté une variable dans ma procédure et ça fonctionne, je garde ton astuce car elle est plus simple, mais au moins ça m'a entraîné pour les procédures & curseurs :D ! Un grand merci !  

  • Partager sur Facebook
  • Partager sur Twitter
5 septembre 2017 à 16:40:19

Re bonjour ! 

Je reviens pour vous demander un coup de main car je galère sur cette consigne :

" Chaque article doit contenir un résumé (ou extrait), qui sera affiché sur la page d’accueil. 

 Mais certains auteurs oublient parfois d’en écrire un. 

 Il faut donc s’arranger pour créer automatiquement un résumé en prenant les 150 premiers caractères de l’article, si l’auteur n’en a pas écrit."

Alors du coup voici mon travail pour celle-ci : 

Je pense que ça vient de mon 'substring', mais je ne comprend pas ce que ça peut-être exactement, mon "resume" est toujours vide :/

Pouvez-vous me guider s'il vous plait ?

  • Partager sur Facebook
  • Partager sur Twitter
5 septembre 2017 à 17:07:35

Bonjour,

Je suis surpris que tu n'ais pas d'erreur sur ton TRIGGER ... Je pense qu'il te faut relire un peu la partie sur les TRIGGER et l'utilisation de la pseudo table NEW ... et également les paramètres de la fonction SUBSTRING ... la position du premier caractère est 1, pas 0 ;)

Je ferais ceci :

DELIMITER |
CREATE TRIGGER before_insert_article
BEFORE INSERT ON article
FOR EACH ROW
BEGIN
	IF NEW.resume IS NULL THEN
		SET NEW.resume = SUBSTRING( NEW.contenu, 1, 150 );
	END IF;
END |
DELIMITER ;

-
Edité par Benzouye 5 septembre 2017 à 17:29:35

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
5 septembre 2017 à 17:26:19

Hummm le problème c'est que j'ai le message d'erreur : "Error Code: 1362. Updating of NEW row is not allowed in after trigger0.000 sec" :/

C'est pour ça que j'avais remplacé le SET par un INSERT, (j'avais testé ta méthode au début), j'ai également essayé en remplaçant le AFTER INSERT par un BEFORE INSERT, mais le résultat est toujours le même :/

-
Edité par CharlyLerenard1 5 septembre 2017 à 17:35:19

  • Partager sur Facebook
  • Partager sur Twitter
5 septembre 2017 à 17:30:22

CharlyLerenard1 a écrit:

Updating of NEW row is not allowed in after trigger

Et oui ... j'avais oublié ce détail ... mais pas grave, juste passer BEFORE ! J'ai édité mon message précédent ;)
  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
5 septembre 2017 à 17:42:19

J'ai toujours ma case "resume" vide :/
  • Partager sur Facebook
  • Partager sur Twitter
5 septembre 2017 à 17:52:32

Attention ... un espace n'est pas la même chose que NULL ...

Soit tu passes NULL pour la colonne resume :

INSERT INTO article ( titre, contenu, auteur_id, date_publication, resume )
VALUES ( 'titre', 'contenu', 1, NOW(), NULL );

-- Ou même sans le préciser
INSERT INTO article ( titre, contenu, auteur_id, date_publication )
VALUES ( 'titre', 'contenu', 1, NOW() );

Soit tu modifies le TRIGGER pour traiter l'espace comme le NULL :

DELIMITER |
CREATE TRIGGER before_insert_article
BEFORE INSERT ON article
FOR EACH ROW
BEGIN
    IF NEW.resume IS NULL OR NEW.resume = '' OR NEW.resume = ' ' THEN
        SET NEW.resume = SUBSTRING( NEW.contenu, 1, 150 );
    END IF;
END |
DELIMITER ;
  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
5 septembre 2017 à 17:53:21

J'avais essayé ça aussi ! Mais j'ai une erreur qui n'a à mon sens pas de lien à l'insertion d'un test :

-
Edité par CharlyLerenard1 5 septembre 2017 à 17:58:27

  • Partager sur Facebook
  • Partager sur Twitter
6 septembre 2017 à 11:29:57

Je suis désolé, mais pour moi, le système fonctionne très bien, sans erreur ...

Ce que j'ai fait :

CREATE TABLE `article` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `contenu` text COLLATE utf8_unicode_ci,
  `resume` text COLLATE utf8_unicode_ci NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

DELIMITER |
CREATE TRIGGER `genere_resume` BEFORE INSERT ON `article` FOR EACH ROW
IF NEW.resume IS NULL THEN
SET NEW.resume = SUBSTRING( NEW.contenu, 1, 150 );
END IF|
DELIMITER ;

INSERT INTO `article` (`contenu`)
VALUES ('blah blah blah');

SELECT * FROM `article`;

Et j'obtiens bien un résumé pour la ligne insérée ...

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
6 septembre 2017 à 12:01:59

Je viens de revenir sur mon travail ce matin, sachant que je n'avais pas éteint MySQL WorkBench durant la nuit, et la première requête lancé MySQL a crash, en me disant qu'il y avait une erreur avec une librairie C++, j'ai relancé, relancé les mêmes requêtes que j'ai posté hier soir, et ça a fonctionné :o 

Je pense donc à un gros bug, en même temps, c'était bizarre comme erreur :"Table 'New.resume' doesn't exist"

Un grand merci ! 

  • Partager sur Facebook
  • Partager sur Twitter
13 septembre 2017 à 11:47:31

Bonjour à toutes et à tous,

Je viens à peine de commencer le cours (vraiment à peine). A ce jour mySQL est remplacé par mariaDB sur les distrib Debian. Lorsque je tape la première commande de test (Hello World !) j'obtiens une erreur 1064. La commande tapée est la suivante :

SELECT 'HELLO WOLRD !';

Du coup je ne comprend pas ce que j'ai fait de mal puisque j'ai recopié ce que l'on me demande :'(.

D'avance merci!

  • Partager sur Facebook
  • Partager sur Twitter
13 septembre 2017 à 13:21:16

Bonjour,

Peux-tu poster l'erreur exacte (texte complet) retourné par MariaDB ?

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
14 septembre 2017 à 9:03:05

Bonjour et merci ! Alors je viens de retaper a même chose que dans mon précédent message, mais allez comprendre pourquoi je n'ai plus d'erreur et tout s'affiche comme il faut :/. Je dois avoir des gros doigts ou je ne sais quoi... Désolé de t'avoir déranger pour rien :(. Et encore merci de l'attention portée à mon message !
  • Partager sur Facebook
  • Partager sur Twitter
27 septembre 2017 à 6:18:47

Bonjour à tous!
J'ai un problème que je voudrais vous soumettre.J'ai récemment débuté le cours "Administrez vos base de données avec MySQL" et j'avais déjà le logiciel MySQL installé mais comme je voulais travailler sur la même version que celle utilisée le long du cours je l'ai désinstallé.Seulement maintenant quand j'essaye d'en installer un autre ,j'ai un message d'erreur(0).
Que dois-je faire?
Merci
  • Partager sur Facebook
  • Partager sur Twitter
1 octobre 2017 à 21:00:14

@PierreckMboukou peux-tu expliciter ou nous montrer le message d'erreur en entier en précisant ton OS
  • Partager sur Facebook
  • Partager sur Twitter
L'important ce n'est pas d'être grand mais c'est être à la hauteur
6 octobre 2017 à 14:51:01

Bonjour,

J'aurai besoin d'un petit coup de pouce sur l'activité_partie 4, pas la solution mais plutôt des pistes, cela concerne l'affichage de la page Article, autant avec un ORM sa glisse autant sur du pur SQL je galère...

Voici ma commande SQL

SELECT
	DATE_FORMAT(Articles.date_publication_article, '%e %M %Y à %l heures %i') AS 'Date de Publication',
	Articles.titre AS Titre,
	Articles.resume,
	Utilisateurs.pseudo AS Auteur,
	GROUP_CONCAT(DISTINCT Categories.nom) AS 'Catégories',
	GROUP_CONCAT(DISTINCT Commentaires.commentaire,
				' du ', DATE_FORMAT(Commentaires.date_commentaire, '%e/%m/%Y')
				ORDER BY Commentaires.date_commentaire DESC
				SEPARATOR ' // ') AS 'Commentaires'
FROM Articles
LEFT JOIN Utilisateurs ON Utilisateurs.id = Articles.auteur_id
LEFT JOIN Categorie_Article ON Categorie_Article.article_id = Articles.id
LEFT JOIN Categories ON Categorie_Article.categorie_id = Categories.id
LEFT JOIN Commentaires ON Commentaires.article_id = Articles.id
LEFT JOIN Utilisateurs AS auteur_commentaire ON Utilisateurs.id = Commentaires.auteur_id
WHERE Articles.id = 4;


Je voulais rajouter la colonne Utilisateurs.pseudo pour chaque commentaires (sachant que la seule colonne dont je dispose dans Commentaires est l'id de l'auteur du commentaire), j'imagine donc qu'il faudrait faire une sorte de sous requête (j'ai déjà essayé mais sans succès) pour obtenir le pseudo de l'auteur (du commentaire), j'ai également essayer de joindre (dernière jointure dans mon code) en nommant un alias que j'ai inséré dans le GROUP_CONCAT mais ça ne fonctionne pas non plus, j'ai essayé de mettre une sous requête dans le GROUP_CONCAT sans succès.

Bref je suis un peu à court d'inspiration ou trop la tête dans le guidon pour voir une évidence, merci pour vos suggestions.

  • Partager sur Facebook
  • Partager sur Twitter
7 octobre 2017 à 10:26:04

Bonjour,

GROUP_CONCAT est une fonction d'agrégat. De ce fait elle fonctionne avec une clause GROUP BY pour expliquer à MySQL comment faire le regroupement ...

Tout cela est expliqué partie 3 :

https://openclassrooms.com/courses/administrez-vos-bases-de-donnees-avec-mysql/fonctions-d-agregation

https://openclassrooms.com/courses/administrez-vos-bases-de-donnees-avec-mysql/regroupement

-
Edité par Benzouye 7 octobre 2017 à 10:26:40

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
7 octobre 2017 à 14:40:52

Merci pour les liens mais malheureusement un peu inutile dans la mesure où je suis le tuto, la doc MySQL...Pour être plus précis voici mon code lié à ce tuto et l'Activité

Je voudrais juste pouvoir affiché le nom de l'auteur du commentaire plutot que son id, voici mon code :

SELECT
	DATE_FORMAT(Articles.date_publication_article, '%e %M %Y à %l heures %i') AS 'Date de Publication',
	Articles.titre AS 'Titre',
	Articles.resume AS 'Résumé',
	Utilisateurs.pseudo AS 'Auteur',
	GROUP_CONCAT(DISTINCT Categories.nom) AS 'Catégories',
	GROUP_CONCAT(DISTINCT Commentaires.commentaire,
				' du ', 	DATE_FORMAT(Commentaires.date_commentaire, '%e/%m/%Y'),
				' par ', Commentaires.id
				ORDER BY Commentaires.date_commentaire DESC
				SEPARATOR ' // ') AS 'Commentaires' 
FROM Articles
LEFT JOIN Utilisateurs ON Utilisateurs.id = Articles.auteur_id
LEFT JOIN Categorie_Article ON Categorie_Article.article_id = Articles.id
LEFT JOIN Categories ON Categorie_Article.categorie_id = Categories.id
LEFT JOIN Commentaires ON Commentaires.article_id = Articles.id
LEFT JOIN Utilisateurs AS auteur_commentaire ON Utilisateurs.id = Commentaires.auteur_id
WHERE Articles.id = 4;

Ma question est : comment dans la fonction GROUP_CONCAT afficher la colonne faisant référence à l'auteur du commentaires référencée par Commentaires.auteur_id ?
L'activité ne le demande pas en revanche si une solution existe je suis preneur.

Merci

  • Partager sur Facebook
  • Partager sur Twitter
7 octobre 2017 à 19:29:28

Si tu donnes un alias à la table utilisateurs pour les commentaires, c'est cet alias qu'il faut utiliser dans la condition de jointure  ... Sinon chaque tu relies encore sur l'utilisateur créateur de l'article, pas sur celui du commentaire. ..

Et si, les liens sont utiles pour ta clause group by. ..

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
12 octobre 2017 à 6:47:08

Bonjour,

Permettez-moi de poser une question sur l'activité 4 du cours.

SELECT a.id, DATE_FORMAT(a.date_publication, '%d %M %Y à %h heures %i') AS date_publication, u.pseudo, a.titre,
-- a.contenu,
GROUP_CONCAT(c.nom SEPARATOR ', ')
FROM Article AS a
INNER JOIN Utilisateur AS u ON a.auteur_id = u.id
INNER JOIN Categorie_article AS ca ON ca.article_id = a.id
INNER JOIN Categorie AS c ON ca.categorie_id = c.id
WHERE a.id = 4
GROUP BY a.id, a.date_publication, u.pseudo, a.titre, a.contenu;

Il s'agit de la 4e requête de l'activité; la partie qui me confuse c'est le GROUP BY, pourquoi le prof pense à l'ajouter ainsi que plusieurs autres camarades? Je vous remercie en avance.

  • Partager sur Facebook
  • Partager sur Twitter
12 octobre 2017 à 11:39:28

Benzouye a écrit:

GROUP_CONCAT est une fonction d'agrégat. De ce fait elle fonctionne avec une clause GROUP BY pour expliquer à MySQL comment faire le regroupement ...

Tout cela est expliqué partie 3 :

https://openclassrooms.com/courses/administrez-vos-bases-de-donnees-avec-mysql/fonctions-d-agregation

https://openclassrooms.com/courses/administrez-vos-bases-de-donnees-avec-mysql/regroupement



  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
12 octobre 2017 à 12:44:05

Ah oui, je vois, j'avais oublié ! C'est aussi parce que mon propre code il s'exécute sans générer de l'erreur de sorte que je néglige ce qu'on avait appris. Pour la complétude, mon code est comme suit.

SELECT
DATE_FORMAT(date_publication, '%d %M %Y à %H heures %i') AS date_pub,
Article.titre,
RPAD(TRIM(Article.contenu), 15, '') AS sub_contenu,
GROUP_CONCAT(DISTINCT Categorie.nom SEPARATOR ', '),
Utilisateur.pseudo
FROM Article
LEFT JOIN Utilisateur ON Article.auteur_id = Utilisateur.id
LEFT JOIN Categorie_article ON Article.id = Categorie_article.article_id
LEFT JOIN Categorie ON categorie_id = Categorie.id
WHERE Article.id = 4;

j'avais dû moi aussi ajouter GROUP BY je pense. Merci !

  • Partager sur Facebook
  • Partager sur Twitter
12 octobre 2017 à 14:04:54

Cette requête sans GROUP BY va retourner des choses étranges ... La clause GROUP BY est nécessaire ici pour préciser comment l'on regroupe ...

La bonne syntaxe SQL serait :

SELECT
	DATE_FORMAT( A.date_publication, '%d %M %Y à %H heures %i') AS date_pub,
	A.titre,
	RPAD(TRIM(A.contenu), 15, '') AS sub_contenu,
	GROUP_CONCAT(DISTINCT C.nom SEPARATOR ', '),
	U.pseudo
FROM
	Article A
		LEFT JOIN Utilisateur U
			ON A.auteur_id = U.id
		LEFT JOIN Categorie_article CA
			ON A.id = CA.article_id
		LEFT JOIN Categorie C
			ON CA.categorie_id = C.id
WHERE A.id = 4
GROUP BY
	DATE_FORMAT( A.date_publication, '%d %M %Y à %H heures %i'),
	A.titre,
	RPAD(TRIM(A.contenu), 15, '') AS sub_contenu,
	U.pseudo

Une syntaxe acceptable pour MySQL (option ONLY_FULL_GROUP_BY désactivée) serait :

SELECT
	DATE_FORMAT( A.date_publication, '%d %M %Y à %H heures %i') AS date_pub,
	A.titre,
	RPAD(TRIM(A.contenu), 15, '') AS sub_contenu,
	GROUP_CONCAT(DISTINCT C.nom SEPARATOR ', '),
	U.pseudo
FROM
	Article A
		LEFT JOIN Utilisateur U
			ON A.auteur_id = U.id
		LEFT JOIN Categorie_article CA
			ON A.id = CA.article_id
		LEFT JOIN Categorie C
			ON CA.categorie_id = C.id
WHERE A.id = 4
GROUP BY A.id
  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
15 octobre 2017 à 20:10:19

Bonjour

J'ai un souci à l'installation de MySQL ! ça bloc où il y a la croix rouge (voir image) j'ai essayer plusieurs fois rien n'y fait.

Je suis sur WINDOW10

Quelqu'un aurait il une solution. Merci d'avance.

 

  • Partager sur Facebook
  • Partager sur Twitter
15 octobre 2017 à 22:56:05

Bonjour,

Il serait interessant de nous montrer l'onglet Log pour prendre connaissance de l'erreur.

Merci

  • Partager sur Facebook
  • Partager sur Twitter