Bon allez, je pensais trouver absolument tout seul, mais j'y ai passé trop d'heures, j'ai l'impression d'en avoir fait le tour et je bloque. Je viens donc solliciter de l'aide.
Il s'agit de l'activité "Améliorer la base de données de votre blog" (Activité partie 6) .
La première question:
1 Sur la page d’accueil, on affiche le nombre de commentaires de chaque article. On veut éviter de calculer cela à chaque affichage de la page. Il faut donc stocker ce nombre quelque part, et automatiser sa mise à jour afin que l’information soit toujours exacte.
J'ai choisi de procéder à l'aide d'un trigger. Tout d'abord j'ai créé une table 'Article_NbreCommentaires' qui prend 2 colonnes:
le numéro de l'article (FK liée à 'Commentaire.article_id') et le nombre de commentaires qui lui est associé.
Une fois que tous les numéros d'articles sont rentrés (chaque nouvel article rentré dans 'Article' verra automatiquement son numéro arriver dans la colonne Article_NbreCommentaires.nbre à l'aide d'un autre trigger dans la table 'Articles') , je veux donc faire un trigger attaché à la table 'Commentaire' :
"Pour toute insertion dans la table commentaire, compter le nombre de commentaires associés à chaque article et modifier le résultat dans la colonne 'Article_NbreCommentaires.nbre'."
Et voici le code que j'ai produit:
DELIMITER |
CREATE TRIGGER after_insert_commentaire AFTER INSERT
ON Commentaire FOR EACH ROW
BEGIN
UPDATE Article_NbreCommentaires
INNER JOIN Commentaire
ON Article_NbreCommentaires.article_id = Commentaire.article_id
SET nbre =
(SELECT COUNT(Commentaire.article_id)
FROM Commentaire
GROUP BY Commentaire.article_id)
;
END |
DELIMITER ;
Or, ceci remplit la table 'Article_NbreCommentaires' pas de la manière désirée. En face de chaque numéro d'article, j'ai le chiffre 1. Donc ça ne compte pas. J'ai essayé plusieurs choses, et sinon ça me compte tous les commentaires de la table et me met le total à chaque ligne.
Je ne jette pas l'éponge, mais je souffre depuis quelques heures Alors j'appelle à l'aide !
(Après il y aura bien sûr à gérer l'affichage du nombre de commentaires dans la page d'accueil + l'insertion d'une nouvelle ligne dans 'Article_NbreCommentaires' à chaque nouvel article dans 'Article'.
Bref, je ne sais pas si je fais trop compliqué ......
PS: j'espère que c'est clair, sinon demandez-moi svp ! Ce sera sans doute plus clair pour ceux qui ont déjà fait l'activité.
J'avais fait ceci en son temps, à voir si cela peut aider.
DELIMITER #
CREATE TRIGGER after_insert_commentaires AFTER INSERT
ON Commentaire FOR EACH ROW
BEGIN
UPDATE Article AS a
SET a.nbre_commentaires = a.nbre_commentaires+1
WHERE a.id = NEW.article_id;
END #
D'accord. Tu as donc rajouté une colonne nbre_commentaires à la table Article. Et le NEW est un mot-clé MySQL à côté duquel je suis passé ou c'est toi qui rajoute une table ? Moi pas comprendre. Il y a plusieurs façons de procéder je vois.
Effectivement, j'avais suivi un certain nombre d'étapes :
ALTER TABLE Article ADD nbre_commentaires SMALLINT UNSIGNED NULL DEFAULT '0'; -- valeur par défaut 0 et + de 65000 commentaires possibles devrait suffire !
-- Intégration du nombre de commentaires dans la table Article ( uniquement pour l'initialisation)
-- 1. Je crée une Vue contenant les id des articles et le nombre de commentaires associés
-- 2. Je transfère le contenu de la colonne "V_nombre_de_commentaires" de la Vue vers la colonne "nbre_commentaires" de la table Article
-- étape 1 :
CREATE OR REPLACE VIEW V_Article_id_nbre_commentaires
AS SELECT a.id AS V_article_id,
COUNT(c.article_id) AS V_nombre_de_commentaires
FROM Article AS a
LEFT JOIN Commentaire AS c
ON c.article_id=a.id
GROUP BY a.id;
-- SELECT * FROM V_Article_id_nbre_commentaires; -- pour afficher le résultat de la vue
-- étape 2 : mise à jour de la colonne "nbre_commentaires" de la table Article à partir de la colonne "V_nombre_de_commentaires" de la Vue V_Article_id_nbre_commentaires
UPDATE Article AS a, V_Article_id_nbre_commentaires AS v
SET a.nbre_commentaires = (SELECT v.V_nombre_de_commentaires
FROM V_Article_id_nbre_commentaires AS v
WHERE v.V_article_id = a.id);
-- SELECT a.id, a.nbre_commentaires FROM Article AS a; -- pour vérifier le résultat du transfert
sachant que dans les commentaires j'avais un Rox , je comprends pas ma derniére commande me retourne empty , je pensais qu'elle allez retourner Rox , merci bien
mais dans le cours on nous explique "Pour ce genre de recherches, l'opérateurLIKEest très utile, car il permet de faire des recherches en utilisant des "jokers", c'est-à-dire des caractères qui représentent n'importe quel caractère.
Deux jokers existent pour LIKE :
'%' : qui représente n'importe quelle chaîne de caractères, quelle que soit sa longueur (y compris une chaîne de longueur 0) ;
'_' : qui représente un seul caractère.
Quelques exemples :
'b%'cherchera toutes les chaînes de caractères commençant par'b'('brocoli', 'bouli', 'b').
'b_'cherchera toutes les chaînes de caractères contenant deux lettres dont la première est'b'('ba', 'bf', 'b8')"
du coup j'ai voulu testeren faisant "Ro_" dans le but de chercher toutes les chaînes de caractères contenant trois lettres dont les deux premiéres sont Ro c'est pas correct ma démarche?
Je suis dans la partie "transactions" du cours et plus particulièrement la partie "Syntaxe et utilisation".
J'avais commencé les 2 premières expériences sans problèmes puis suite à une mauvaise manip (j'ai supprimé toutes les données de la table animal) je réimporté la base entière (format sql) qui est proposée au début du cours "transactions".
Je reprend mes expériences, la 3ème "validation et annulation" et au moment d'insérer la première requête :
INSERT INTO Animal (nom, espece_id, date_naissance, sexe)
VALUES ('Baba', 5, '2012-02-13 15:45:00', 'F');
MySql m'explique qu'à cause de la clé étrangère sur espece_id, je peux pas modifier les données de ma table ? Je ne comprend plus, tout fonctionnait bien avant, quelqu'un a t-il eu le même problème ?
Je pense que tu as des valeurs NULL dans la colonne espece_id de la table Animal, et que cela n'est plus autorisé après modification de la colonne ...
Avant de faire la modification, il faut t'assurer que chaque enregistrement Animal a une valeur pour espece_id.
CasteloWoshu a écrit:
ERROR 1300 (HYOOO): Invalid utf8 character string: 'Num\x82ro'
Comment as-tu procédé pour pour créer cette table ? Il semblerait qu'il y ait là un problème d'encodage de caractères dans ta requête de création ...
Maxormarcus a écrit:
MySql m'explique qu'à cause de la clé étrangère sur espece_id, je peux pas modifier les données de ma table ?
Si tu essayes d'insérer dans la table Animal une enregistrement dont l'espece_id n'existe pas dans la table espece, oui MySQL refuse l'insertion ... Assure-toi que l'espece_id 5 existe bien dans la table espece ...
En fait, lorsque j'insert mes données, j'ai des erreurs concernant des éléments dans les colonnes "description" et ce dès qu'un accent se présente en fait. Donc en fait, cela empêche d'insérer les données, mes tables sont vides voilà pourquoi je ne pouvais rien insérer hier.
Cela dit, je ne comprend pas pourquoi j'ai ce problème que je n'avais pas avant, pourtant je spécifie bien SET NAMES utf8; mais rien n'y fait. Je regarde sur internet mais je sèche et perd un temps fou devant un problème, encore une fois surement tout bête.
pourtant je spécifie bien SET NAMES utf8; mais rien n'y fait.
Comment travailles-tu ? En console ? Avec un fichier .SQL et la commande SOURCE ? Avec PHPMyAdmin (ou du genre) ?
Je bosse sur la console MySQL Client 5.7, pas de PHPMyAdmin, et le fichier que j'importe via SOURCE, c'est en fait le copié collé du rappel de la base de données "elevage" (que l'on trouve au début de chaque chapitre) que j'ai converti en .SQL
Pour simplifier le chemin je l'ai mis à la racine de mon disque donc il s'ouvre mais sort des erreurs que j'ai cité précédemment.
le fichier que j'importe via SOURCE, c'est en fait le copié collé du rappel de la base de données "elevage" (que l'on trouve au début de chaque chapitre) que j'ai converti en .SQL
Vérfies alors l'encodage de ce fichier. Avec un éditeur de texte (genre notepad++) assure-toi que l'encodage est bien UTF8.
le fichier que j'importe via SOURCE, c'est en fait le copié collé du rappel de la base de données "elevage" (que l'on trouve au début de chaque chapitre) que j'ai converti en .SQL
Vérfies alors l'encodage de ce fichier. Avec un éditeur de texte (genre notepad++) assure-toi que l'encodage est bien UTF8.
je ne devrais passer que par notepad++, merci, problème résolu.
Jointures sur deux tables, ou plus ! 1. La race ET l'espèce Vous devez obtenir la liste des chats et des perroquets amazones, avec leur sexe, leur espèce (nom latin) et leur race s'ils en ont une. Regroupez les chats ensemble, les perroquets ensemble et, au sein de l'espèce, regroupez les races.
J'essaye de faire la requete mais je comprends pas pourquoi avec Like ça ne fonctionne pas cfr l'avant derniére requete , avec IN ça fonctionne bien
Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour celà, il faut utiliser le bouton . Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: c;">Votre code ici</pre>.
Merci de modifier votre message en conséquence via le bouton "Modifier" situé sur son coin supérieur droit, sans quoi le sujet sera fermé.
Sinon, concernant ta question, c'est parce que le colonne ne peut être LIKE chat ET LIKE perroquet ... C'est LIKE chat OU LIKE perroquet ...
CREATE DATABASE p2p_blog CHARACTER SET utf8;
USE p2p_blog;
CREATE TABLE Article (
id INT UNSIGNED AUTO_INCREMENT NOT NULL,
Titre VARCHAR(250) NOT NULL,
Texte LONGTEXT NOT NULL,
Résumé MEDIUMTEXT NOT NULL,
commentaires MEDIUMTEXT NOT NULL, -- On va verifier que chaque commentaires --
PRIMARY KEY(id) -- est bien liée à un utilisateur même s'il s'enregistre pas --
CONSTRAINT fk_commentaires_id
FOREIGN KEY (commentaires)
REFERENCES Utilisateur(id)
)
ENGINE=InnoDB;
CREATE TABLE Utilisateur (
id INT UNSIGNED AUTO_INCREMENT NOT NULL,
pseudo VARCHAR(150) ,
email VARCHAR(255) ,
mot_passe TINYTEXT,
PRIMARY KEY(id)
)
ENGINE=InnoDB;
CREATE TABLE Categorie (
id INT UNSIGNED AUTO_INCREMENT NOT NULL,
nom VARCHAR(150) NOT NULL,
description TEXT NOT NULL,
PRIMARY KEY(id)
)
ENGINE=InnoDB;
CREATE TABLE Categorie_article (
categorie_id INT UNSIGNED,
article_id INT UNSIGNED,
PRIMARY KEY (categorie_id, article_id)
CONSTRAINT fk_categorie_id_id -- En créant cette clé étrangére on s'assure que --
-- les articles appartiennent à au moins une catégorie --
FOREIGN KEY (categorie_id)
REFERENCES Categorie(id)
)
ENGINE=InnoDB;
-- On va maintenant remplir les différentes Tables Avant l'affichage --
J'ai les erreurs suivantes :
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near '├®sum
├® MEDIUMTEXT NOT NULL,
commentaires MEDIUMTEXT NOT NULL,
PRIMA' at line 6
Query OK, 0 rows affected (0.02 sec)
Query OK, 0 rows affected (0.03 sec)
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'CONST
RAINT fk_categorie_id
' at line 7
mysql>
La premiére erreur : il considére que Résumé est un mot spécial pourtant j'ai bien mit tout en mot utf8 ??
La seconde erreur je la comprend pas non plus car je pense avoir bien suivit les régles pour faire une clé étrangére .
On dirait que j'ai vraiment un souci avec UTF-8, il ne lever plus d'erreur le fichier est bien encoder en UTF-8 Sur SQL
mysql> DESCRIBE Article;
+--------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+------------------+------+-----+---------+----------------+
| auteur | int(10) unsigned | NO | PRI | NULL | auto_increment |
| Titre | varchar(250) | NO | | NULL | |
| Texte | longtext | NO | | NULL | |
| R├®sum├® | mediumtext | NO | | NULL | |
| commentaires | varchar(250) | NO | | NULL | |
+--------------+------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
Pour la colonne Résumé les accents ne passe pas , pourtant j'ai bien mits encodage UTF8(sans BOM) sur NOTEPAD ++ ET j'ai essayé avec BOM et c'est la même chose :(
Il me semble avoir lu dans le cours qu'il valait mieux éviter de mettre des accents pour le nom d'un champ. Un champ "resume" fait tout à fait l'affaire et évite les désagréments tels que tu rencontres. Un petit conseil également pour le nom des champs soit tu mets la première lettre avec une majuscule soit en minuscule (il devraient être écrit tout en minuscule par convention) mais une fois que tu as pris une décision, il faut s'y tenir sur toutes les tables de ta base voire toutes les bases que tu créera à l'avenir: ça pourra éviter bien des problèmes. Tu des champs avec majuscule d'autre sans; imagine si, dans quelques mois, tu dois interroger ta base !!!
SELECT auteur, Titre FROM Article
ou
SELECT Auteur, titre FROM Article
ou
SELECT Auteur, Titre FROM Article
Suivant l'OS employé, ça passe ou ça casse !
A+ et bon courage pour la suite.
- Edité par Philippe2463 13 mars 2018 à 17:45:53
La chute n'est pas un échec, l'échec c'est de rester là où on est tombé!
Jamais d'accent pour le nom des colonnes ! Sacrilège ! Et même tout en minuscule. A la limite pour la première lettre du nom de la table. A la limite ...
Jamais d'accent pour le nom des colonnes ! Sacrilège ! Et même tout en minuscule. A la limite pour la première lettre du nom de la table. A la limite ...
Dans l'Avant-propos de la 3eme partie "Création d'une base de données", le lien vers la documentation officielle MySQL relative aux mots-clés réservés redirige vers une page Not Found : https://dev.mysql.com/doc/refman/5.5/en/reserved-words.html
Christophe Vallot
Christophe Vallot