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 hirérachique mysql


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 340
    Points : 97
    Points
    97
    Par défaut requête hirérachique mysql
    Salut à tous,

    J'ai un gros problème avec une requête hiérarchique. En fait je ne sais pas du totu comment faire. J'ai une table qui contient des informations concernant chevaux. (Voir la photo ci-jointe qui contient le modèle.)

    je souhaiterais pouvoir afficher pour le cheval no1 par exemple sa mère et son père.

    Si le cheval no 1 s'appelle Paille
    Sa mère est le cheval no 10
    Son père le cheval no 30

    J'aimerais afficher le cheval no 1 et le nom de sa père et de sa mère....

    Est-ce quelqu'un peut m'aider.
    J'espère que mes explications sont assez précises

    D'avance merci
    Images attachées Images attachées  

  2. #2
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Salut,

    Il faut faire une jointure entre la table cheval et elle-même. Quelles sont les colonnes qui référencent le père et la mère ?
    Pensez au bouton

  3. #3
    Membre éprouvé
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Points : 984
    Points
    984
    Par défaut
    Salut,

    Ton problème résulte sûrement d'une mauvaise conception (en fait, je ne comprends pas la structure actuelle de ta table). Avec une table Cheval(idCheval, idClient, nomCheval, ........, idPere, idMere), c'est assez simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT c.nomCheval AS nom, m.nomCheval as mere, p.nomCheval as pere
    FROM cheval c
    JOIN cheval m ON c.idMere = m.idCheval
    JOIN cheval p ON c.idPere = p.idCheval
    WHERE c.id = x

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 340
    Points : 97
    Points
    97
    Par défaut
    en fait c'est dans la table "etre" que j'indique le no de mon cheval et celui qui est parent de ce cheval

    voir schéma d'occurence en image

    j'ai appris justement que l'on ne devait pas mettre de champs mère et père dans la table mais que c'est en indiquant avec les identifiants que l'on fait le lien

    J'espère que vous pourrez m'aider avec ces informations supplémentaires....ca serait chouette
    Images attachées Images attachées  

  5. #5
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Tu devrais suivre les indications de Biglo. Un cheval ne peut pas avoir plusieurs pères ou mères donc Cheval(idCheval, idClient, nomCheval, ........, idPere, idMere) irait très bien.
    Pensez au bouton

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 340
    Points : 97
    Points
    97
    Par défaut
    ok ben je vais essayer avec cela....

    Merci

  7. #7
    Membre éprouvé
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Points : 984
    Points
    984
    Par défaut
    Citation Envoyé par kitty2006
    j'ai appris justement que l'on ne devait pas mettre de champs mère et père dans la table mais que c'est en indiquant avec les identifiants que l'on fait le lien
    C'est justement les identifiants des parents qu'il faut utiliser.

    Comme l'a dit Maximilian, un cheval n'a (normalement) qu'une seule mère et qu'un seul père. Le problème avec ta structure est que tu vas pouvoir enregistrer plusieurs mères et plusieurs pères pour un même cheval : tu as modélisé une relation 0,n au lieu de deux relations 0,1.

    Si tu ne connais pas les parents d'un cheval, tu peux stocker NULL dans les colonnes idMere et idPere.

    Bonne continuation

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 340
    Points : 97
    Points
    97
    Par défaut
    Bonjour,
    Merci à tous pour vos réponses, j'ai changé mes tables et j'ai rajouté les champs id-pere et id_mere....

    Mais je ne comprends pas le code que Bingo a laisseé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT c.nomCheval AS nom, m.nomCheval as mere, p.nomCheval as pere
    FROM cheval c
    JOIN cheval m ON c.idMere = m.idCheval
    JOIN cheval p ON c.idPere = p.idCheval
    WHERE c.id = x
    que représente m.idCheval et p.idCheval.

    D'avance merci

  9. #9
    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 : 40
    Localisation : France

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

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

    c'est l'id cheval pour la table ou il y aura le nom du pere et de la mere
    tu fais des auto-jointures donc il faut utiliser des alias

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 340
    Points : 97
    Points
    97
    Par défaut
    Salut à tous,

    je ne comprends toujours pas le bout de code:
    que signifie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c.nomCheval AS nom m.nomCheval as mere
    Pour les alias j'ai plus ou monis compris...mais que veut dire ce "c." et "m."

    D'avance merci

  11. #11
    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 : 40
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 641
    Points
    4 641
    Par défaut
    c. et m. ce sont les alias de tes tables
    as sert a renommer ta colonne pour éviter l'ambiguité

    si tu ne comprends pas je te ferais une reponse plus précise ce soir

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 340
    Points : 97
    Points
    97
    Par défaut
    désolé mais ca ne me semble toujours pas clair

    Si je peux avoir plus d'explication ca serait sympa

    D'avance merci

  13. #13
    Membre éprouvé
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Points : 984
    Points
    984
    Par défaut
    Les alias permettent surtout de simplifier l'écriture des requêtes : au lieu de retaper toujours le nom de la table, tu utilises l'alias.

    Mais dans la requête que je t'avais donnée, ils sont obligatoires. Le fait que la table cheval soit 3 fois nécessaires (pour l'enfant, le père et la mère) ne permet pas à MySQL de savoir quel idCheval est concerné : il y a une ambiguïté. Il faut donc préciser, en utilisant les alias, si idCheval est celui du père, de la mère ou de l'enfant.

    J'ai utilisé "m" pour mère, "p" pour père et "c" pour cheval. Ce n'est pas vraiment génial pour la lisibilité de la requête. Ceci serait plus facile à comprendre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT enfant.nomCheval AS nomEnfant, mere.nomCheval as nomMere, pere.nomCheval as nomPere
    FROM cheval enfant
    JOIN cheval mere ON enfant.idMere = mere.idCheval
    JOIN cheval pere ON enfant.idPere = pere.idCheval
    WHERE enfant.idCheval = x

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 340
    Points : 97
    Points
    97
    Par défaut
    Merci Biglo pour les explications

    Mais j'ai essayé de faire ce que tu dis avec le code que tu as donné, mais ca ne fonctionne pas correctement....
    Voici ci-dessous la structure de ma table cheval

    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
    CREATE TABLE `cheval` (
      `ID_CHEVAL` int(11) NOT NULL auto_increment,
      `FK_CLIENT` int(11) default NULL,
      `FK_SEXE` int(10) NOT NULL default '0',
      `FK_RACE` int(10) NOT NULL default '0',
      `FK_ROBE` int(10) NOT NULL default '0',
      `CHE_NO_ID` varchar(20) default NULL,
      `CHE_NOM` varchar(20) NOT NULL default '',
      `CHE_DATE_NAIS` date default NULL,
      `CHE_GAROT` varchar(20) default NULL,
      `CHE_PHOTO_CHEMIN` varchar(50) default NULL,
      `CHE_DESCENDANCE` varchar(20) default NULL,
      `CHE_D_ENTREE` date NOT NULL default '0000-00-00',
      `CHE_D_SORTIE` date NOT NULL default '0000-00-00',
      `CHE_A_VENDRE` tinyint(4) NOT NULL default '0',
      `CHE_REMARQUE` varchar(50) default NULL,
      `CHE_A_AFFI` tinyint(4) NOT NULL default '0',
      `ID_PERE` varchar(100) NOT NULL default '0',
      `ID_MERE` int(100) NOT NULL default '0',
      PRIMARY KEY  (`ID_CHEVAL`),
      KEY `DETENIR_FK` (`FK_CLIENT`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=60 ;

    Et pour le code j'a mis ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT enfant.CHE_NOM AS nomEnfant, mere.CHE_NOM as nomMere, 
    FROM cheval enfant
    JOIN cheval mere ON enfant.idMere = mere.idCheval
    WHERE enfant.idCheval = 1;
    J'ai texté cette requête sous easyphp, et il indique que des champs sont inconnus

    D'avance merci

  15. #15
    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 : 40
    Localisation : France

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

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

    si tu mets les bons noms de colonne, cela fonctionnera mieux ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT enfant.CHE_NOM AS nomEnfant, mere.CHE_NOM as nomMere
    FROM cheval enfant
    JOIN cheval mere ON enfant.id_Mere = mere.id_Cheval
    WHERE enfant.id_Cheval = 1;

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 340
    Points : 97
    Points
    97
    Par défaut
    Désolé j'essaie de faire au mieux

    je modifier des champs, ca ne met plus de fautes, mais par contre ca n'affiche rien....k'ce que j'ai encore de faux?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT enfant.CHE_NOM AS nomEnfant, mere.CHE_NOM as nomMere
    FROM cheval enfant
    JOIN cheval mere ON enfant.ID_CHEVAL = mere.ID_MERE
    WHERE enfant.ID_CHEVAL = 1;
    D'avance merci pour l'aide

  17. #17
    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 : 40
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 641
    Points
    4 641
    Par défaut
    peux tu mettre quelque ligne qui se trouve dans ta tables? (les requetes dinsertions)
    ?

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 340
    Points : 97
    Points
    97
    Par défaut
    Le script de création des tables se trouvent plus haut

    Voici les insertions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     Contenu de la table `cheval`
    -- 
     
    INSERT INTO `cheval` VALUES (1, 1, 1, 1, 1, 'CH-080.1', 'Floride', '1988-03-12', '150', 'florida.jpg', 'oui', '0000-00-00', '0000-00-00', 1, 'autres', 1, '35', 37);
    INSERT INTO `cheval` VALUES (35, 1, 1, 1, 1, 'CH-1330039', 'Mandolin', '1995-03-26', '155', 'MANDO_I.jpg', '', '0000-00-00', '0000-00-00', 0, 'Cheval énergique', 1, 'OURS', 0);
    INSERT INTO `cheval` VALUES (37, 3, 1, 1, 2, '021.1990.1', 'Albionne', '1990-03-24', '154', 'ALBIO_I.jpg', '', '1990-03-24', '0000-00-00', 1, 'Cheval énergique, très maternelle', 1, '0', 0);
    INSERT INTO `cheval` VALUES (38, 1, 1, 1, 1, 'CH-1993225', 'Fanette', '1993-05-04', '156', 'FANET_I.JPG', '', '1993-05-04', '0000-04-05', 1, '', 1, '0', 0);
    INSERT INTO `cheval` VALUES (42, 1, 1, 1, 1, 'CH-122682', 'Laïka', '1994-03-11', '156', 'LAIKA_I.JPG', '', '1994-03-11', '0000-00-00', 0, '', 1, '0', 0);


    Encore merci pour l'aide c'est vraiment sympa

  19. #19
    Membre éprouvé
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Points : 984
    Points
    984
    Par défaut
    Citation Envoyé par kitty2006
    Désolé j'essaie de faire au mieux

    je modifier des champs, ca ne met plus de fautes, mais par contre ca n'affiche rien....k'ce que j'ai encore de faux?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT enfant.CHE_NOM AS nomEnfant, mere.CHE_NOM as nomMere
    FROM cheval enfant
    JOIN cheval mere ON enfant.ID_CHEVAL = mere.ID_MERE
    WHERE enfant.ID_CHEVAL = 1;
    D'avance merci pour l'aide
    Tu as inversé ID_CHEVAL et ID_MERE !

    Et pourquoi ID_PERE est en VARCHAR(100) dans ta table ? Ce n'est pas forcément un cheval enregistré ?

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 340
    Points : 97
    Points
    97
    Par défaut
    Merci de m'avertir pour "varchar 100" je n'avais pas vu...c'est simplement une erreur de ma part.

    Je vais essayer avec cela...merci beacoup, je redonne des nouvelles

    a+

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. modifier une requête pour mysql 4.0.18
    Par lina01 dans le forum Requêtes
    Réponses: 1
    Dernier message: 20/11/2006, 11h38
  2. EDBEngineError sur une requête pour MySQL
    Par Slyteck dans le forum Bases de données
    Réponses: 4
    Dernier message: 10/08/2006, 14h17
  3. Sous-requête sous mysql 3
    Par photorelief dans le forum Requêtes
    Réponses: 1
    Dernier message: 07/06/2006, 11h16
  4. Problème sur requête insert mysql
    Par kcizth dans le forum Requêtes
    Réponses: 5
    Dernier message: 04/02/2006, 18h37
  5. Performance de la requête connexion à MySQL
    Par yazerty dans le forum Requêtes
    Réponses: 5
    Dernier message: 22/12/2005, 14h40

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