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 :

un casse tete sql


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut un casse tete sql
    salut a tous, pour optimiser une application, je voudrais créer une vue ...
    évitons les discours, j'ai fais un montage simplifié, le but est d'atteindre "ma_vue" sur ce montage

    Merci de m'aider un peu. bonne journée a tous.
    Images attachées Images attachées  

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    Sur quel point bloquez vous en fait ?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    "ma_vue" est un montage photoshop, je n'arrive pas a creer les champs nb1, go, nb2, lot, en fait, j'arrive a pas grand chose :-(

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 126
    Points : 179
    Points
    179
    Par défaut
    Salut!
    As-tu déjà essayé de faire une requête qui te retourne ce que tu veux?

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Pour le moment je fait en php :

    -----------------------------------
    puis ds le while
    -----------------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    "select  count(donnees_sup.valeur) as nb, donnees_sup.valeur
                        from donnees_sup 
                        inner join champs on donnees_sup.id_champs=champs.id
                        where champs.id_type_champs=1
                        and id_reserves=".$row['id']
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    "select  count(donnees_sup.valeur) as nb, donnees_sup.valeur
                        from donnees_sup 
                        inner join champs on donnees_sup.id_champs=champs.id
                        where champs.id_type_champs=2
                        and id_reserves=".$row['id']

  6. #6
    Membre expérimenté
    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
    Points : 1 631
    Points
    1 631
    Par défaut
    Bonjour,

    Ne jamais remplacer une requête SQL avec des jointures par des boucles vous allez écrouler votre serveur MySQL !!!

    Si toutes vos tables sont lié (relation clé primaire, clé étrangère ou autre) il vous suffit de faire une jointure entre chaque table.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT r.id , c.type_champs, ds.valeur, count(ds.valeur) as nb
    FROM reserve r
    INNER JOIN donnees_sup ds ON r.id = ds.id_reserves
    INNER JOIN champs c ON ds.id_champs = c.id
    GROUP BY r.id, c.type_champs, ds.valeur
    Je pense que cette requête doit correspondre à ce que vous attendez. Par contre il n'est pas possible de regrouper sur une seul ligne tout les information pour un id de la table reserves (dans votre exemple nb1 et nb2 sont sur la même ligne, dans ma requête pour chaque type_champs une nouvelle ligne est créé, il est "impossible" de le faire en une seul requête SQL).

    Pour créer la vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE VIEW maVue AS
    SELECT ...
    une réponse vous a permis d'avancer ?

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Que donne cette requête (non testée) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    SELECT r.*, t2.nb_1, t2.libelle_1, t2.nb_2, t2.libelle_2
      FROM reserve r
      JOIN donnees_sup ds 
        ON ds.id_reserves = r.id
      join (select v.id_champs, t.min_id, 
                   max(case when c.id_type_champs = 1 then t.nb end) as nb_1,
                   max(case when c.id_type_champs = 1 then t.valeur end) as libelle_1,
                   max(case when c.id_type_champs = 2 then t.nb end) as nb_2,
                   max(case when c.id_type_champs = 2 then t.valeur end) as libelle_2
              from valeurs v
              join (select id_champs, min(id) as min_id, count(*) as nb
                      from valeurs                  
                     group by id_champs) t
                on t.id_champs = v.id_champs
               and t.min_id    = v.min_id
              join champs c 
                on c.id = t.id_champs
             group by v.id_champs, t.min_id
           ) t2
        on t2.id_champs = ds.id_champs
       and t2.min_id    = ds.valeur
    PS : Le * est à remplacer par la liste des colonnes évidemment.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    j'obtient le message suivant.

    Unknown column 't.valeur' in 'field list'

    mais l'esprit a l'air super, ... et me depasse un peu ...

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    j'ai ajouté "valeur" ds les champs de la jointure mais la j'ai :
    Unknown column 'v.min_id' in 'on clause'
    -----------------------

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    SELECT r.id,r.id_projet,r.nb_reserve_val,r.nb_reserve_lib,r.titre,r.type,r.niveau_criticite, t2.nb_1, t2.libelle_1, t2.nb_2, t2.libelle_2
      FROM reserves r
      JOIN donnees_sup ds 
        ON ds.id_reserves = r.id
      JOIN (SELECT v.id_champs, t.min_id, 
                   max(case when c.id_type_champs = 1 then t.nb end) AS nb_1,
                   max(case when c.id_type_champs = 1 then t.valeur end) AS libelle_1,
                   max(case when c.id_type_champs = 2 then t.nb end) AS nb_2,
                   max(case when c.id_type_champs = 2 then t.valeur end) AS libelle_2
              FROM valeurs v
              JOIN (SELECT id_champs, min(id) AS min_id, count(*) AS nb, valeur
                      FROM valeurs                  
                     GROUP BY id_champs) t
                ON t.id_champs = v.id_champs
               AND t.min_id    = v.min_id
              JOIN champs c 
                ON c.id = t.id_champs
             GROUP BY v.id_champs, t.min_id
           ) t2
        ON t2.id_champs = ds.id_champs
       AND t2.min_id    = ds.valeur

  10. #10
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    C'est v.valeur qu'il faut utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    SELECT r.*, t2.nb_1, t2.libelle_1, t2.nb_2, t2.libelle_2
      FROM reserve r
      JOIN donnees_sup ds 
        ON ds.id_reserves = r.id
      join (select v.id_champs, t.min_id, 
                   max(case when c.id_type_champs = 1 then t.nb end) as nb_1,
                   max(case when c.id_type_champs = 1 then v.valeur end) as libelle_1,
                   max(case when c.id_type_champs = 2 then t.nb end) as nb_2,
                   max(case when c.id_type_champs = 2 then v.valeur end) as libelle_2
              from valeurs v
              join (select id_champs, min(id) as min_id, count(*) as nb
                      from valeurs                  
                     group by id_champs) t
                on t.id_champs = v.id_champs
               and t.min_id    = v.id
              join champs c 
                on c.id = t.id_champs
             group by v.id_champs, t.min_id
           ) t2
        on t2.id_champs = ds.id_champs
       and t2.min_id    = ds.valeur

Discussions similaires

  1. SQL Casse tete selection regroupe
    Par cgregueusse dans le forum Langage SQL
    Réponses: 8
    Dernier message: 15/09/2008, 13h26
  2. Tube nommé: un casse tête
    Par yashiro dans le forum Linux
    Réponses: 2
    Dernier message: 28/06/2006, 09h11
  3. Requete Casse tete... Help..
    Par Jerome218 dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/01/2006, 05h57
  4. casse tete de requete
    Par moutey dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/12/2004, 14h00
  5. [casse-tete (pour moi)] recuperer la largeur d'un <div>
    Par Invité dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 05/11/2004, 07h39

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