IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Créer une vue complexe à partir d'une base de données


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de jamdinhe
    Inscrit en
    Avril 2006
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 167
    Par défaut Créer une vue complexe à partir d'une base de données
    Bonjour,
    voici une partie de la base de données pour laquelle je souhaite créer une vue pour un site web qui affiche les produits et leurs notes
    Nom : Vue.png
Affichages : 4160
Taille : 5,8 Ko
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    categorie (id_cat, nom_cat)
    typ (id_typ, nom_typ, #id_cat)
    marque (id_marq, nom_marq)
    produit (id_prod, nom_prod, img_prod, #id_marq)
    internaute (id_int, pseudo_int, pass_int)
    appartient (id_cat, id_marq)
    avoir (id_prod, id_typ)
    avis (id_prod, id_int, note)
    Ce que je veux obtenir est une vue qui respecte la structure suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    vue(id_prod, nom_prod, img_prod, id_marq, nom_marq, id_typ, nom_typ, moyenne_note)
     
    à condition que id_cat=2
    moyenne_note=avg(avis.note) par produit
    regrouper la sélection de moyenne_note en même temps que d'afficher les produits me bloque,
    pouvez-vous m'aider là-dessus ?

    Merci à tout ceux qui veulent aider
    amine

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Par défaut
    Bonjour,

    Montrez nous la requête que vous avez déjà fait pour que l'on puisse vous aiguiller.

    Il faudra que vous utilisiez la clause GROUP BY pour connaitre la moyenne des notes.

  3. #3
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 211
    Billets dans le blog
    16
    Par défaut
    Comme dit le camarade, avec un Group By (bien placé) ça peut passer...

    Quelque chose comme ça (à vérifier !) :


    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT x.IdProd, AVG(Note) AS Moyenne  
    FROM   PRODUIT AS x JOIN APPARTIENT AS y ON x.IdMarq = y.IdMarq
                        JOIN AVIS AS z ON x.IdProd = z.IdProd 
    WHERE  y.IdCat = 'cat01'
    GROUP BY IdProd  
    ;
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  4. #4
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 211
    Billets dans le blog
    16
    Par défaut
    Plus complet :


    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE VIEW VUE (id_prod, nom_prod, img_prod, id_marq, nom_marq, id_typ, nom_typ, moyenne_note) 
    AS
    SELECT x.IdProd, x.NomProd, x.Imgprod, y.IdMarq, NomMarq, u.IdTyp, u.NomTyp, AVG(Note) AS Moyenne  
    FROM   PRODUIT AS x JOIN APPARTIENT AS y ON x.IdMarq = y.IdMarq
                        JOIN AVIS AS z ON x.IdProd = z.IdProd 
                        JOIN MARQUE AS t ON y.IdMarq = t.IdMarq 
                        JOIN TYPEE AS u ON y.IdCat = u.IdCat
    WHERE  y.IdCat = 'cat01'
    GROUP BY IdProd 
    ;
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  5. #5
    Membre confirmé Avatar de jamdinhe
    Inscrit en
    Avril 2006
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 167
    Par défaut
    Citation Envoyé par fsmrel Voir le message
    Plus complet :


    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE VIEW VUE (id_prod, nom_prod, img_prod, id_marq, nom_marq, id_typ, nom_typ, moyenne_note) 
    AS
    SELECT x.IdProd, x.NomProd, x.Imgprod, y.IdMarq, NomMarq, u.IdTyp, u.NomTyp, AVG(Note) AS Moyenne  
    FROM   PRODUIT AS x JOIN APPARTIENT AS y ON x.IdMarq = y.IdMarq
                        JOIN AVIS AS z ON x.IdProd = z.IdProd 
                        JOIN MARQUE AS t ON y.IdMarq = t.IdMarq 
                        JOIN TYPEE AS u ON y.IdCat = u.IdCat
    WHERE  y.IdCat = 'cat01'
    GROUP BY IdProd 
    ;
    Merci à fsmrel et à Exia93 de m'avoir mis sur la ligne,
    pour la solution proposée, elle ne m'affiche que les produits ayant une note, aussi, elle m'affiche le même type pour tous les produits !

    J'ai pu rectifier ça et ça marche super, voila la solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE VIEW VUE (id_prod, nom_prod, img_prod, id_marq, nom_marq, id_typ, nom_typ, moyenne_note) 
    AS
    SELECT x.Id_Prod, x.Nom_Prod, x.Img_prod, y.Id_Marq, Nom_Marq, u.Id_Typ, u.Nom_Typ, AVG(Note) AS Moyenne  
    FROM   PRODUIT AS x LEFT JOIN APPARTIENT AS y ON x.IdMarq = y.IdMarq
                        LEFT JOIN AVIS AS z ON x.Id_Prod = z.Id_Prod 
                        LEFT JOIN MARQUE AS t ON y.Id_Marq = t.Id_Marq 
                        LEFT JOIN AVOIR AS f ON f.id_prod=x.id_prod
                        LEFT JOIN TYP AS u ON y.Id_typ = u.Id_typ
    WHERE  y.IdCat = 'cat01'
    GROUP BY IdProd 
    ;
    Entre temps, je me suis aperçus que je dois d'abord valider les notes attribuées par les internautes, donc j'ai rajouté la propriété validation à l'association avis qui prend pour valeur soit "oui" ou "non";
    donc, ma base de données est devenue comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    categorie (id_cat, nom_cat)
    typ (id_typ, nom_typ, #id_cat)
    marque (id_marq, nom_marq)
    produit (id_prod, nom_prod, img_prod, #id_marq)
    internaute (id_int, pseudo_int, pass_int)
    appartient (id_cat, id_marq)
    avoir (id_prod, id_typ)
    avis (id_prod, id_int, note, validation)
    De ce fait, la moyenne des notes est calculée à partir des notes pour lesquelles le champ validation vaut "oui",
    et quand j'ajoute la condition z.validation='oui' dans la clause WHERE, j'obtiens une vue qui n'affiche que les produits ayant des notes et pas les autres !
    Comment faire pour obtenir la bonne vue ?
    amine

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Par défaut
    Bonjour,

    La requête n'est pas conforme à la norme SQL, comme expliqué dans le cours de SQLPro sur la clause GROUP BY :
    De plus, toutes les colonnes représentées hors des calculs d'agrégation doivent figurer dans la clause GROUP BY.
    Sans ça les colonnes non soumises à une fonction de regroupement ne se trouvant pas dans le GROUP BY auront une valeur aléatoire dans l'ensemble des valeurs disponibles pour ce regroupement.

    Votre requête ré-écrite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE VIEW VUE (id_prod, nom_prod, img_prod, id_marq, nom_marq, id_typ, nom_typ, moyenne_note) 
    AS
    SELECT x.Id_Prod, x.Nom_Prod, x.Img_prod, y.Id_Marq, Nom_Marq, u.Id_Typ, u.Nom_Typ, AVG(Note) AS Moyenne  
    FROM   PRODUIT AS x LEFT JOIN APPARTIENT AS y ON x.IdMarq = y.IdMarq
                        LEFT JOIN AVIS AS z ON x.Id_Prod = z.Id_Prod 
                        LEFT JOIN MARQUE AS t ON y.Id_Marq = t.Id_Marq 
                        LEFT JOIN AVOIR AS f ON f.id_prod=x.id_prod
                        LEFT JOIN TYP AS u ON y.Id_typ = u.Id_typ
    WHERE  y.IdCat = 'cat01'
    GROUP BY x.Id_Prod, x.Nom_Prod, x.Img_prod, y.Id_Marq, Nom_Marq, u.Id_Typ, u.Nom_Typ
    Pour votre nouvelle colonne "validation", préférez un booléen ou un entier court (bit, Booleen, entier court), car la comparaison d'une chaîne de caractères avec une autre est plus coûteuse qu'un simple booléen ou un entier court.

    Votre nouvelle requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE VIEW VUE (id_prod, nom_prod, img_prod, id_marq, nom_marq, id_typ, nom_typ, moyenne_note) 
    AS
    SELECT x.Id_Prod, x.Nom_Prod, x.Img_prod, y.Id_Marq, Nom_Marq, u.Id_Typ, u.Nom_Typ, AVG(Note) AS Moyenne  
    FROM   PRODUIT AS x LEFT JOIN APPARTIENT AS y ON x.IdMarq = y.IdMarq
                        LEFT JOIN AVIS AS z ON x.Id_Prod = z.Id_Prod AND z.validation = 'oui' -- à remplacer par la nouvelle valeur
                        LEFT JOIN MARQUE AS t ON y.Id_Marq = t.Id_Marq 
                        LEFT JOIN AVOIR AS f ON f.id_prod=x.id_prod
                        LEFT JOIN TYP AS u ON y.Id_typ = u.Id_typ
    WHERE  y.IdCat = 'cat01'
    GROUP BY x.Id_Prod, x.Nom_Prod, x.Img_prod, y.Id_Marq, Nom_Marq, u.Id_Typ, u.Nom_Typ

  7. #7
    Membre confirmé Avatar de jamdinhe
    Inscrit en
    Avril 2006
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 167
    Par défaut
    Merci fsmrel pour la remarque, au fait c'était moi qui m'était trompé quand j'avais repris le MLD sur le forum, je viens de le corriger, donc c'est bon tout rentre dans l'ordre.

    Sinon, pour la vue, apparemment il n'y a pas d'autres solutions à part celle qu'a donné Exia93 ?

    Si c'est le cas, je mets la discussion sur Résolu.

    Merci encore à tout le monde, j'espère que d'autres développeurs vont bénéficier de ces informations
    amine

  8. #8
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 211
    Billets dans le blog
    16
    Par défaut
    Si le SGBD rouspète et refuse de créer la vue (c'est MySQL ?), vous pouvez créer une 1ere vue pour filtrer la partie validation :


    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE VIEW  VALIDATION  (IdProd, Note)	
    AS  
        SELECT IdProd, Note
        FROM   AVIS 
        WHERE Validation = 'oui'
    ;

    Et vous y vous faites référence dans la vue principale :


    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE VIEW VUE (id_prod, nom_prod, img_prod, id_marq, nom_marq, id_typ, nom_typ, moyenne_note)
    AS
    SELECT x.IdProd, x.NomProd, x.Imgprod, y.IdMarq, NomMarq, u.IdTyp, u.NomTyp, AVG(Note) AS Moyenne  
    FROM   PRODUIT AS x LEFT JOIN APPARTIENT AS y ON x.IdMarq = y.IdMarq
                        LEFT JOIN VALIDATION AS z ON x.IdProd = z.IdProd
                        LEFT JOIN MARQUE AS t ON y.IdMarq = t.IdMarq 
                        LEFT JOIN AVOIR AS f ON f.idprod= x.idprod
                        LEFT JOIN TYP AS u ON f.Idtyp = u.Idtyp
    WHERE  y.IdCat = 'cat01'
    GROUP BY x.IdProd, x.NomProd, x.Imgprod, y.IdMarq, t.NomMarq, u.IdTyp, u.NomTyp
    ;

    Qu'est-ce que ça donne ?
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  9. #9
    Membre confirmé Avatar de jamdinhe
    Inscrit en
    Avril 2006
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 167
    Par défaut
    Salut, c'est donc la solution au problème.

    Je vous remercie encore de m'avoir aidé et conseillé, c'est très aimable de poster dans ce forum.

    J'espère qu'il y aura d'autres développeurs qui vont profiter de cette discussion pour avancer dans leurs projets.

    amine

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Retourner sur une vue 1 à partir d'une vue 2
    Par pitchu dans le forum Android
    Réponses: 2
    Dernier message: 24/04/2015, 22h21
  2. Réponses: 3
    Dernier message: 03/03/2015, 15h55
  3. Réponses: 8
    Dernier message: 16/02/2012, 22h23
  4. Réponses: 2
    Dernier message: 05/04/2009, 23h01
  5. Créer des clés informatiques à partir d'1 base de données??
    Par Flateric dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 11/02/2005, 07h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo