problèmede construction d'une requête

sanspseudo
Invité n'ayant pas de compte PHPfrance

13 juin 2006, 16:39

Bonjour,

Pour commencer, je tiens à préciser que je ne connais pas assez PHP pour te donner les syntaxes, mais coté base de données j'ai une petite expérience.

Tu te retrouves confronté à un problème récurrent de hiérarchie.
Pour ton cas :
Tout cheval à un père et une mère
Tout père est un cheval, il à donc un père et une mère
Tout mère est un cheval, elle à donc un père et une mère
Même raisonnement pour les grands parents et les poulains à venir.

Donc, je mettrais en place une table 'Cheval' constituée de la façon suivante :
Champ 1 : 'Id cheval' de type numérique auto incrément
Champ 2 : 'Sexe' de type caractère ( M ou F )
Champ 3 : 'Nom' de type caractère
Champ 4 : 'Date naissance' de type date
Champ 5 : 'id du père' de type numérique
Champ 6 : 'id de la mère' de type numérique

Ceci avec 2 auto jointures :
- du champ 5 vers le champ 1
(chaque info du champ 5 (sauf les ?) doit exister dans le champ 1)
- du champ 6 vers le champ 1
(chaque info du champ 6 (sauf les ?) doit exister dans le champ 1)

Donc voici la table cheval :

Code : Tout sélectionner

|id|sexe|nom|date naiss|id père|id mère| |--|----|---|----------|-------|-------| | 1| M | A | | ? | ? | | 2| F | B | | ? | ? | | 3| M | C | | 1 | 2 | | 4| F | D | | 1 | ? | | 5| M | E | | ? | 2 | | 6| M | F | | ? | ? | | 7| F | G | | 6 | 2 | | 8| F | H | | 6 | 4 | | 9| M | I | | 5 | 8 | |10| M | J | | 6 | 8 |
Remarque : les ? correspondent à des informations que tu n'as pas. A force de remonter les branches tu finiras bien par avoir des informations qui te manque. Selon les bases de données c'est la valeur Null, empty, ...

En suite il suffit de lire les informations dans la table :
Le cheval C dont l'id est 3 n'est père d'aucun cheval
La jument B dont l'id est 2 est mère 3 chevaux (C, E et G : 2 males, 1 femelle)

Si j'ai bien compris ton problème, pour moi c'est la structure idéale.

Eléphanteau du PHP | 10 Messages

13 juin 2006, 17:04

GENIAL !! Merci beaucoup, ça fonctionne !!
Cependant, j'aimerai classer les noms dans l'ordre alphabétique, j'ai rajouté "ORDER BY nom_cheval ASC"; mais ça me fait une erreur :
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\Program Files\wamp\www\Bremoy\ficheCheval.php on line 193

Voici comment je l'ai ajouté :
$sql = "SELECT cheval.idcheval, cheval.nom AS 'nom_cheval', mere.idmere, mere.nom AS 'nom_mere' ".
       "FROM `cheval`, `mere` ".
       "WHERE cheval.mere = mere.idmere ".
       "AND mere.nom = '". $nom ."';".
       "ORDER BY nom_cheval ASC";
$exec = mysql_query($sql);
Je ne comprends pas pourquoi ça ne fonctionne pas.

Mammouth du PHP | 1353 Messages

13 juin 2006, 17:06

$sql = "SELECT cheval.idcheval, cheval.nom AS 'nom_cheval', mere.idmere, mere.nom AS 'nom_mere' ". 
       "FROM `cheval`, `mere` ". 
       "WHERE cheval.mere = mere.idmere ". 
       "AND mere.nom = '". $nom ."';". 
       "ORDER BY 
cheval.nom ASC"; 

EDIT : erreur aussi de ma part, mal lu :(
Modifié en dernier par guilt92 le 13 juin 2006, 17:08, modifié 2 fois.
Tell me and I forget. Teach me and I remember. Involve me and I learn.

Eléphanteau du PHP | 10 Messages

13 juin 2006, 17:07

OUPS !! je me suis trompée dans mon post... excusez moi !!

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

13 juin 2006, 17:09

:pouce: moi je suis pour cette solution de sanspseudo qui est plus simple.

test de la solution par des requêtes:
1. liste des mères :

Code : Tout sélectionner

SELECT distinct mere.id, mere.nom from cheval fils join cheval mere on fils.id_mere = mere.id
2. liste des fils d'une mere connue par $id :

Code : Tout sélectionner

SELECT fils.id, fils.nom from cheval fils where fils.id_mere = $id
3. liste des fréres d'un fils connue par $id :

Code : Tout sélectionner

SELECT frere.id, frere.nom from cheval frere join (SELECT id_mere from cheval where id = $id) mere_de_id on mere_de_id.id_mere = frere.id_mere
...ect.. ça devient un jeu ...
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 10 Messages

13 juin 2006, 17:11

(en fait je ne m'étais pas trompée...)
Avec "ORDER BY cheval.nom ASC"; ça ne fonctionne pas non plus... :(

Eléphanteau du PHP | 10 Messages

13 juin 2006, 17:22

Le problème dans la solution de sanspseudo, c'est qu'il n'y a aucun père qui fasse partie de l'élevage. Donc, je ne fait pas de fiche pour les pères, et comme ceux-ci reviennent régulièrement, je n'ai fait que les rentrer dans la table "pere" avec son nom, son pere, sa mere, et ses grands parents.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

13 juin 2006, 17:31

mais ça me fait une erreur :
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\Program Files\wamp\www\Bremoy\ficheCheval.php on line 193
=> http://www.phpfrance.com/forums/voir_sujet-19378.php

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

14 juin 2006, 09:46

$sql = "SELECT cheval.idcheval, cheval.nom AS 'nom_cheval', mere.idmere, mere.nom AS 'nom_mere' ". 
       "FROM `cheval`, `mere` ". 
       "WHERE cheval.mere = mere.idmere ". 
       "AND mere.nom = '". $nom . "' ORDER BY nom_cheval ASC"; 
$exec = mysql_query($sql);
J'ai enlevé un ; qui trainait dans le flot sans raison entre $nom et ORDER By
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 10 Messages

14 juin 2006, 13:31

Merci 1000 fois pour tout !!
Tout fonctionne maintenant ! :D