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 :

Requête complexe avec plusieurs lignes par table


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Requête complexe avec plusieurs lignes par table
    Bonjour à tous,

    Je viens de découvrir (honte à moi) qu'on pouvait faire des requêtes mysql sur plusieurs tables, ce qui devrait considérablement soulager mon serveur mysql. Je suis entrain de construire une nouvelle table plus efficace en faisant des essais de requêtes, mais il y a certaines choses que je n'arrive pas à faire. En gros, il s'agit de référencer des livres pouvant avoir plusieurs auteurs.

    En simplifiant un peu, j'ai trois tables :

    book pour les livres
    book_id | book_title

    people pour les auteurs
    people_id | people_name

    et book_people pour lier les deux
    id | book_id | people_id

    J'ai une requête qui ressemble à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT `book`.`book_id` , `book_title` , `people_name`
    FROM `book` , `people` , `book_people`
    WHERE 
      `book_people`.`book_id` = `book`.`book_id` AND
      `people`.`people_id` = `book_people`.`people_id`
    Dans ma base, j'ai actuellement trois livres, le premier avec un auteur, les deux autres avec deux auteurs chacun. Lorsque j'entre ma requête dans phpMyAdmin, il me sort un tableau qui ressort à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    book_id | book_title                | people_name
    1       | Fondation  	             | Isaac ASIMOV
    2       | Fantômes et farfafouilles | Fredric BROWN
    2       | Fantômes et farfafouilles | Jean SENDY
    3       | Planète à gogos            | Frederik POHL
    3       | Planète à gogos 	     | Cyril M. KORNBLUTH
    Or, je voudrais plutôt quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    1 | Fondation  	               | Isaac ASIMOV
    2 | Fantômes et farfafouilles | Fredric BROWN, Jean SENDY
    3 | Planète à gogos           | Frederik POHL, Cyril M. KORNBLUTH
    Mais peut-être que c'est quelque chose à traiter après, en php ? Sachant que je voudrais pouvoir trier le résultat par auteur (en utilisant le premier auteur).

    Voilà, j'espère que ma demande est claire... Merci d'avance !

  2. #2
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    salut,

    déjà, tu pourrais écrire ta requête avec des jointures normalisées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT book.book_id , book_title , people_name
    FROM book_people 
    JOIN people ON people.people_id = book_people.people_id
    JOIN book ON book_people.book_id = book.book_id
    ensuite, la mise en forme des données est en générale faite par PHP

    Cependant, cela ne respecte pas la norme SQL, mais MySQL permet de faire des choses de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT book.book_id , book_title , group_concat(people_name)
    FROM book_people 
    JOIN people ON people.people_id = book_people.people_id
    JOIN book ON book_people.book_id = book.book_id
    group by book.book_id , book_title
    Regarde d'un peu plus prêt l'utilisation de group_concat

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Ca marche très bien, merci ! Je vais étudier les possibilité de GROUP_CONCAT...

    Citation Envoyé par Cybher Voir le message
    Cependant, cela ne respecte pas la norme SQL
    Est-ce que cela peut poser problème ?

  4. #4
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    si tu passes sur d'autres SGBD, cette requête ne fonctionnera pas tout simplement. Mais tant que tu restes sur MySQL, il n'y a pas de soucis

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Je reviens vers vous quelques mois plus tard pour un souci sur le même projet, toujours avec les jointures.

    J'ai créé une table cycles qui permet de gérer les bouquins appartenant à un cycle qui ressemble à :

    Dans ma table books, j'ai ajouté un champ cycle_id et j'ai donc une requête à peu près comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT book_id , book_title, cycle_name
    FROM books
    JOIN cycles ON book.cycle_id = cycles.cycle_id

    En retour, il me sort bien un tableau du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    book_id    | book_title                          | cycle_name
    1          | La communauté de l anneau           | Le seigneur des anneaux
    2          | Fondation                           | Fondation
    3          | Fondation et Empire                 | Fondation
    Le souci est que dans ce tableau, il n'affiche que les livres appartenant à un cycle, donc pour lesquels `cycle_id` est différent de 0. Or il y a des tas de livres indépendants qui ne font pas partie d'un cycle. Comment faire pour afficher aussi ces entrées de ma table books ?

    Encore une fois, j'espère avoir été assez clair... merci d'avance !

  6. #6
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Citation Envoyé par Iwazaru Voir le message
    Le souci est que dans ce tableau, il n'affiche que les livres appartenant à un cycle, donc pour lesquels `cycle_id` est différent de 0. Or il y a des tas de livres indépendants qui ne font pas partie d'un cycle. Comment faire pour afficher aussi ces entrées de ma table books ?
    C'est justement pour ces cas que l'on a les jointures externes ("LEFT [OUTER] JOIN").

    Juste un détail, s'il n'y a pas de cycle, `cycle_id` devrait être NULL plutôt que '0'. '0' fait référence au cycle d'identifiant '0' qui a de bonnes chances de ne pas exister, et provoquerait une violation des contraintes d'intégrité si elles étaient définies.

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

Discussions similaires

  1. [AC-2010] Exporter du texte avec plusieurs lignes par enregistrement
    Par oplaut dans le forum VBA Access
    Réponses: 4
    Dernier message: 03/04/2013, 18h08
  2. Réponses: 4
    Dernier message: 11/01/2011, 16h29
  3. [SQL] Requête complexe avec appel multiple à la même table
    Par Julien Dufour dans le forum Langage SQL
    Réponses: 9
    Dernier message: 14/04/2005, 14h12
  4. Encore une requête complexe sur plusieurs tables
    Par DenPro dans le forum Langage SQL
    Réponses: 5
    Dernier message: 09/12/2003, 19h05
  5. Requête complexe sur plusieurs table
    Par DenPro dans le forum Langage SQL
    Réponses: 13
    Dernier message: 25/11/2003, 17h50

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