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

Langage SQL Discussion :

Factorisation d'une requête


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2013
    Messages : 47
    Points : 45
    Points
    45
    Par défaut Factorisation d'une requête
    Bonjour tout le monde.
    J'obtiens ce que je veux, certes, mais peux mieux faire.
    Je ne voulais pas ne pas réussir par moi même, maintenant que j'ai réussi je souhaite avoir de l'aide pour mieux avancer, mieux comprendre la logique SQL.
    Avant toute chose, le résultat de cette requête me servira pour construire une nouvelle requête, elle deviendra donc une sous-requête.

    Le principe : des concouristes votes pour le produit qu'ils préfèrent dans 3 catégories
    J'ai donc trois tables + 1 table relationnelle:

    utilisateurs: [uti_id][uti_nom] ...
    categories: [cat_id][cat_label]...
    produits: [pro_id][pro_cat_id][nb_votes]...
    votes: [vt_uti_id][vt_pro_id]

    Donc si je fais une jointure sur chacune de ces tables ( ce dont je n'ai pas besoin ) j'obtiens le résultat suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    uti_id | uti_nom | cat_id | cat_label      |pro_id  | pro_cat_id | vt_uti_id | vt_pro_id | nb_votes
    1       | iseult     | 1        | dessin          | 12       | 1               | 1             | 12          | 5320
    1       | iseult     | 2        | peinture       | 75       | 2               | 1             | 75          | 1235
    1       | iseult     | 3        | photo           | 125     | 3               | 1             | 125        | 723
    2       | théo      | 1        | dessin          | 14       | 1               | 1             | 14          | 6251
    2       | théo      | 2        | peinture       | 75       | 2               | 1             | 75          | 1235
    2       | théo      | 2        | photo           | 120     | 2               | 1             | 120        | 125
    Ce que je souhaite c'est d'avoir le résultat suivant :

    uti_id | pro_id de la cat_1 AS dessin | pro_id de la cat_2 AS peinture | pro_id de la cat_3 AS photo

    1 | 12 | 75 | 125
    2 | 14 | 75 | 120

    Alors j'y arrive mais c'est tiré par les cheveux....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT uti_id,
    (select vt_pro_id FROM te_votes_vt INNER JOIN te_produits_pro ON te_votes_vt.vt_pro_id=te_produits_pro.pro_id WHERE pro_cat_id=1 AND vt_uti_id=uti_id) AS dessin,
    (select vt_pro_id FROM te_votes_vt INNER JOIN te_produits_pro ON te_votes_vt.vt_pro_id=te_produits_pro.pro_id WHERE pro_cat_id=2 AND vt_uti_id=uti_id) AS peinture,
    (select vt_pro_id FROM te_votes_vt INNER JOIN te_produits_pro ON te_votes_vt.vt_pro_id=te_produits_pro.pro_id WHERE pro_cat_id=3 AND vt_uti_id=uti_id) AS photo
    FROM te_utilisateurs_uti INNER JOIN te_votes_vt ON te_utilisateurs_uti.uti_id=te_votes_vt.vt_uti_id INNER JOIN te_produits_pro ON te_votes_vt.vt_pro_id=te_produits_pro.pro_id GROUP BY uti_id ORDER BY uti_id
    Merci à toutes et tous pour votre aide et précieux conseils

    et désolé pour les tabulations de tableaux un peu pourries...

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 729
    Points
    52 729
    Billets dans le blog
    5
    Par défaut
    Solution classique : CASE
    Solution dégueu : PIVOT

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2013
    Messages : 47
    Points : 45
    Points
    45
    Par défaut
    Bon... je suis largué. Je n'y arrive pas. Je fais n'importe quoi, je tourne en rond...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT uti_id,
    (select vt_pro_id FROM te_votes_vt INNER JOIN te_produits_pro ON te_votes_vt.vt_pro_id=te_produits_pro.pro_id WHERE 
    CASE 
      WHEN pro_cat_id=1 
      THEN SET categorie := dessin;
      WHEN pro_cat_id=2 
      THEN SET categorie := peinture;
      WHEN pro_cat_id=3 
      THEN SET categorie := photo;
    END CASE;
    AND vt_uti_id=uti_id) AS categorie,
    FROM te_utilisateurs_uti INNER JOIN te_votes_vt ON te_utilisateurs_uti.uti_id=te_votes_vt.vt_uti_id INNER JOIN te_produits_pro ON te_votes_vt.vt_pro_id=te_produits_pro.pro_id GROUP BY uti_id ORDER BY uti_id

  4. #4
    Membre régulier
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Mars 2016
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Mars 2016
    Messages : 58
    Points : 105
    Points
    105
    Par défaut
    Bonjour,

    Pas sur d'avoir compris la structure et le besoin final de la requete mais un exemple de resolution pourrait ressembler a cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
     SELECT uti_id,
      MIN(case when pro_cat_id = 1 then vt_pro_id else null end) as dessin, 
      MIN(case when pro_cat_id = 2 then vt_pro_id else null end) as peinture, 
      MIN(case when pro_cat_id = 3 then vt_pro_id else null end) as photo
    FROM   te_utilisateurs_uti
           INNER JOIN te_votes_vt
                   ON te_utilisateurs_uti.uti_id = te_votes_vt.vt_uti_id
           INNER JOIN te_produits_pro
                   ON te_votes_vt.vt_pro_id = te_produits_pro.pro_id
    GROUP  BY uti_id
    ORDER  BY uti_id

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2013
    Messages : 47
    Points : 45
    Points
    45
    Par défaut
    Bonjour,


    Merci pour vos réponses.
    Je pense qu'un CASE pourrait-être remplacé par une sous requête avec une auto jointure. Car un CASE dans ce cas là optimise trop peu une requête à rallonge.
    Mais bon, j'ai pu me débrouiller par moi même. La requête est fonctionnelle, c'est là tout ce qui m’intéresse, et pour ce qui est de la factorisation, je verrai ça plus tard.
    Merci.

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

Discussions similaires

  1. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38
  2. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 08h45
  3. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 01h17
  4. Proposer le resultat d'une requête en téléchargement
    Par Lux interior dans le forum XMLRAD
    Réponses: 5
    Dernier message: 17/02/2003, 15h44
  5. [BDD] Enregistrer le résultat d'une requête
    Par Mowgly dans le forum C++Builder
    Réponses: 5
    Dernier message: 19/06/2002, 15h26

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