Partage

[Cours] Administrez vos BDD avec MySQL

Staff 14 février 2018 à 11:49:59

Bonjour,

CasteloWoshu a écrit:

est-ce que c'est du tout simplement à la taille de ma console?

Oui ...

Pour résoudre cela simplement, donne un alias à la colonne :

SELECT
    *,
    MATCH(titre, auteur) AGAINST ('Jules Verne Lune') AS pertinence
FROM Livre;
Seul on va plus vite ... Ensemble on va plus loin ! A maîtriser : Conception BDDMySQL, HTML/CSS, PHP/MySQL
16 février 2018 à 21:12:36

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 :D 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é.

-
Edité par Delgesu 16 février 2018 à 21:28:34

17 février 2018 à 10:21:47

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 #



Christophe Vallot
17 février 2018 à 18:59:11

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.

19 février 2018 à 10:19:22

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



Christophe Vallot
Il y a environ 10 heures

Bonjour j'ai voulu tester une commande  : 

 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 :)

Staff Il y a environ 6 heures

Bonjour,

_ ne vaut pas x ...

Seul on va plus vite ... Ensemble on va plus loin ! A maîtriser : Conception BDDMySQL, HTML/CSS, PHP/MySQL
Il y a environ 6 heures

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? 

[Cours] Administrez vos BDD avec MySQL

× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
  • Editeur
  • Markdown