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 :

Validité requête et structure base


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 365
    Points : 192
    Points
    192
    Par défaut Validité requête et structure base
    Bonjour,

    J'ai une base de données avec notamment ces tables :

    - 1 table FONCTION comportant comme champs : id_fonction et nom_fonction
    - 1 table CONTRIBUTEURS comportant comme champs : id_contributeur, nom_contributeur, prenom_contributeur
    - 1 table LIVRE comportant comme champs notamment : id_livre, titre ...
    - 1 table PARTICIPE comportant comme champs : id_contributeur, id_fonction et id_livre

    J'utilise la requête suivante :

    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
    SELECT L.TITRE AS titre,
    GROUP_CONCAT(DISTINCT CB.NOM_CONTRIBUTEUR SEPARATOR "|") AS contributeurs,
    GROUP_CONCAT(DISTINCT F.NOM_FONCTION SEPARATOR "|") AS nom_fonctions
     
    FROM LIVRE L
     
    INNER JOIN PARTICIPE P
    ON P.ID_LIVRE = L.ID_LIVRE	
    INNER JOIN CONTRIBUTEURS CB
    ON CB.ID_CONTRIBUTEUR = P.ID_CONTRIBUTEUR
     
    INNER JOIN FONCTION F
    ON F.ID_FONCTION = P.ID_FONCTION	
     
    GROUP BY L.id_livre
    Je me demande si la structure de ma base est cohérente et si la requête est correcte. Sachant que je souhaite établir en PHP une relation entre un array des fonctions et un array des contributeurs. Qu'en pensez-vous ? Merci d'avance.

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 036
    Points
    34 036
    Billets dans le blog
    14
    Par défaut
    La structure de la BDD est correcte.
    Mais pourquoi vouloir faire en PHP ce que le SQL permet de faire, probablement avec plus d'efficacité : travailler sur des ensembles ?

    Ta requête avec GROUP_CONCAT va créer des chaînes de caractères que tu devras ensuite "exploder" en PHP pour retrouver les élements individuels. C'est gourmand en SQL et gourmand en PHP donc mauvaise stratégie !

    Explique plus concrètement ce que tu veux faire et nous t'aiderons à construire la requête adéquate.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 365
    Points : 192
    Points
    192
    Par défaut
    Bonjour,

    Merci pour la réponse.
    Ta requête avec GROUP_CONCAT va créer des chaînes de caractères que tu devras ensuite "exploder" en PHP pour retrouver les élements individuels
    Effectivement, j'ai le bout de code suivant utilisant les explode :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    <?php
     $reponse = $bdd->query('SELECT L.TITRE AS titre, (...)
     
                                    GROUP_CONCAT(DISTINCT CB.NOM_CONTRIBUTEUR SEPARATOR "|") AS contributeurs,
                                    GROUP_CONCAT(DISTINCT F.NOM_FONCTION SEPARATOR "|") AS nom_fonctions
     
                                    FROM LIVRE L
                                    (...)
     
                                    INNER JOIN PARTICIPE P
                                            ON P.ID_LIVRE = L.ID_LIVRE     
                                    INNER JOIN CONTRIBUTEURS CB
                                            ON CB.ID_CONTRIBUTEUR = P.ID_CONTRIBUTEUR
     
                                    INNER JOIN FONCTION F
                                            ON F.ID_FONCTION = P.ID_FONCTION               
     
     
                                    GROUP BY L.id_livre
                                    ORDER BY L.TITRE
                                    LIMIT 0,100')
     
     
    $tab_contributeurs = array();
    $tab_fonctions = array();
     
    foreach($reponse as $row)
    {
     
    $titre = $row['titre'];
    (...)
     
    $tab_contributeurs = explode('|', $row['contributeurs']);
    $tab_fonctions= explode('|', $row['nom_fonctions']);
     
     
    // affichage des fonctions : auteur, traducteur
     
              foreach($tab_fonctions as $fonction)
     
               echo $fonction.' : <br/>';
     
     
              // affichage des contributeurs : identité de l'auteur, traducteur
     
          foreach($tab_contributeurs as $contributeur)
     
               echo $contributeur.'<br/>';
     
    }?>
    Cela me donne l'affichage suivant :

    traducteur :
    auteur :
    auteur1
    auteur2
    traducteur1
    traducteur2

    alors que je souhaite cet affichage :

    auteurs : auteur1, auteur2 (...)
    traducteurs : traducteur1, traducteur2 (...)


    J'ai fait les var_dump (ex : Pour un livre ayant comme auteurs : E. Winter et Collectif et comme traducteur : Breque) :

    - de $tab_fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array(2) { [0]=>  string(6) "auteur" [1]=>  string(10) "traducteur" }
    - de $tab_contributeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array(3) { [0]=>  string(9) "E. Winter" [1]=>  string(6) "Breque" [2]=>  string(9) "Collectif" }
    L'affichage obtenu est :

    auteur :
    traducteur :
    E. Winter
    Breque
    Collectif

    Non seulement ce n'est pas l'affichage souhaité mais au vu de ton message je ne devrais pas utiliser les GROUP_CONCAT et les explode ... A noter que je comptais utiliser la même méthode pour afficher les catégories, les genres et lecteurs de mes livres (relations N/N).

    Je suis preneur de toute solution alternative pour construire la requête adéquate compte tenu de l'affichage souhaité. Merci d'avance.

    PS : j'utilise MySQL.

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 036
    Points
    34 036
    Billets dans le blog
    14
    Par défaut
    Pour la présentation des données issues de la requête, adresse toi au forum PHP et MySQL, après avoir regardé quand même les nombreux tutoriels disponibles parce que ton problème est assez classique : le traitement des ruptures dans un tableau multi-dimensionnel.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 365
    Points : 192
    Points
    192
    Par défaut
    Merci pour ta réponse. Ma requête est-elle finalement correcte avec ses GROUP-CONCAT ? (GROUP-CONCAT car : un livre peut avoir été écrit, traduit par 1 ou plusieurs contributeurs, et un auteur, traducteur peut avoir contribué à 1 ou plusieurs livres).
    Les jointures sont-elles correctement matérialisées ? J'ai un doute quant au lien fait par ma requête entre la table fonction et la table contributeurs... Merci de me dire si ma requête est valable.

    L'affichage souhaité est donc exclusivement du domaine PHP (avec notamment des explode) ?
    J'ai eu beau chercher, je n'ai pas trouvé de tutorial sur le traitement des ruptures dans un tableau multi-dimensionnel. Pourrais-tu m'indiquer certains liens ? Merci d'avance

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 036
    Points
    34 036
    Billets dans le blog
    14
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT L.TITRE,
        CB.NOM_CONTRIBUTEUR,
        F.NOM_FONCTION
    FROM LIVRE L
    INNER JOIN PARTICIPE P ON P.ID_LIVRE = L.ID_LIVRE
        INNER JOIN CONTRIBUTEURS CB ON CB.ID_CONTRIBUTEUR = P.ID_CONTRIBUTEUR
        INNER JOIN FONCTION F ON F.ID_FONCTION = P.ID_FONCTION
    ORDER BY L.TITRE, F.NOM_FONCTION, CD.NOM_CONTRIBUTEUR
    Avec la requête ci-dessus, tu vas récupérer dans php un tableau du style :
    [TITRE] / [NOM_CONTRIBUTEUR] / [NOM_FONCTION]
    'SQL' / 'Frédéric Brouard' / 'Auteur'
    'SQL' / 'RudiBruchez' / 'Auteur'
    'SQL' / 'Christian Soutou' / 'Auteur'
    'SQL' / 'Pearson' / 'Editeur'
    'Astérix le Gaulois' / 'René Gosciny' / 'Scénariste'
    'Astérix le Gaulois' / 'Albert Uderzo' / 'Dessinateur'
    'Astérix le Gaulois' / 'Dargaud' / 'Editeur'

    Ton programme PHP doit parcourir le tableau et construire l'affichage à chaque changement de fonction pour un même titre et à chaque titre.

    Mon appellation de traitement des ruptures dans un tableau multi-dimensionnel était un peu pompeuse, j'en conviens !

    La requête sera beaucoup plus rapide à exécuter sans le groupage sur un grand nombre de lignes et PHP est bien outillé pour parcourir les tableaux de résultat et éventuellement concaténer les chaînes de caractères extraites de ce tableau.
    Mais ce n'est pas l'objet de ce forum.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 365
    Points : 192
    Points
    192
    Par défaut
    Merci pour cette réponse complémentaire. Je vais poster un message sur le forum PHP/MySQL pour avoir des pistes sur la construction de l'affichage car je pensais que seul le couple GROUP-CONCAT/explode pouvait conduire à l'affichage souhaité...

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

Discussions similaires

  1. Requête entre deux bases
    Par dcollart dans le forum Informix
    Réponses: 2
    Dernier message: 22/05/2006, 08h54
  2. [MySQL] Faire une requête recourant à deux bases de données
    Par bourvil dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 02/04/2006, 15h35
  3. [requête sur plusieurs bases]
    Par viny dans le forum Requêtes
    Réponses: 3
    Dernier message: 21/02/2006, 14h18
  4. Requête sur plusieurs bases de données
    Par Oluha dans le forum ASP
    Réponses: 8
    Dernier message: 14/10/2005, 14h57
  5. [BDE]requête dans plusieurs bases
    Par sbeu dans le forum Bases de données
    Réponses: 2
    Dernier message: 01/03/2004, 09h24

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