problèmede construction d'une requête

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : problèmede construction d'une requête

par grrreeeyyy » 14 juin 2006, 13:31

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

par sadeq » 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

par ouckileou » 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

par grrreeeyyy » 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.

par grrreeeyyy » 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... :(

par sadeq » 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 ...

par grrreeeyyy » 13 juin 2006, 17:07

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

par guilt92 » 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 :(

par grrreeeyyy » 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.

par sanspseudo » 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.

par Cyrano » 13 juin 2006, 07:59

Et pourquoi pas une seule requête avec une jointure ?
<?php
$sql = "SELECT c.idcheval, c.nom AS 'nom_cheval', m.idmere, m.nom AS 'nom_mere' ".
       "FROM `cheval`, `mere` ".
       "WHERE c.mere = m.idmere ".
       "AND m.nom = '". $nom ."';";
$exec = mysql_query($sql);
while(false != ($ligne = mysql_fetch_array($exec)))
{
    ?>
<a class="lien" href="ficheCheval.php?idcheval=<?php echo $ligne['idcheval']; ?>"><?php echo $ligne['nom_cheval'];?></a><br />
	<?php
}
?>

par grrreeeyyy » 13 juin 2006, 00:41

Voici mes tables :
-cheval : idcheval, nom, sexe, pouliniere,pere, mere...
-mere : idmere, nom, race, pere, mere, grdperepat, grdmerepat, grdperemat, grdmeremat
-pere : idpere, nom, race, pere, mere, grdperepat, grdmerepat, grdperemat, grdmeremat

"pouliniere" dans la table "cheval" renvoie SF (selle français), TF (trotteur français) ou non, si ce n'est pas une poulinière
"pere" et "mere" de la table "cheval" correspondent aux "idpere" et "idmere" des tables "pere" et mere".

par Cyrano » 12 juin 2006, 21:18

Et ta structure de base ?

par Invité » 12 juin 2006, 20:46

Voici ce que j'ai fait :
<?php
	$requete_mere = mysql_query("SELECT nom, idmere FROM mere WHERE nom = '$nom'");
	$requete_mere = mysql_fetch_array($requete_mere);
	$idmere           = $requete_mere['idmere'];
	$mere_nom      = $requete_mere['nom'];

	$requete_enfants = mysql_query("SELECT idcheval, nom FROM cheval WHERE mere = '$idmere' ORDER BY nom DESC");
	$requete_enfants = mysql_fetch_array($requete_enfants);
	$id_enfants         = $requete_enfants['idcheval'];
	$nom_enfants      = $requete_enfants['nom'];
while($requete_enfants){
		?>

Code : Tout sélectionner

<a class="lien" href="ficheCheval.php?idcheval=<?php echo $requete_enfants['idcheval']; ?>"><?php echo $requete_enfants['nom'];?><br /></a>
<?php 
		 }
		?>

par Cyrano » 12 juin 2006, 19:40

Si tu n'as pas modifié ta structure, alors montre-nous la structure actuelle et la requête que tu as essayé qu'on puisse y détecter d'éventuelles erreurs.