[resolu] 2 requête en une, comment faire ?

Mammouth du PHP | 19672 Messages

05 oct. 2011, 19:10

Bon en fait avec le jeu de données que tu as donné plus haut, il y a une erreur dans les données puisque les pe`res et mères de tes toutous sont assez improbables :
  1. Le premier est son propre père et au moment de son enregistrement a eu pour mère une chienne inexistante dans la base;
  2. Les deux suivant ont des parents totalement inexistant dans la base avec les identifiants respectifs 27, 58, 588 et 752.
Pour ta requête, essaye-la avec 752 ou 588, ça devrait te sortir au moins une ligne.

Mais de toutes manière, ta table a une erreur de conception : les colonnes lof_pere et lof_mere sont en NOT NULL, or tu n'auras pas obligatoirement les informations sur les parents d'un chien au moment de son enregistrement, ou encore tu les connaitras peut-être mais s'ils ne sont pas dans la base, tu n'auras pas l'identifiant, et même là, il faudrait de toutes façons remonter jusqu'aux deux premiers chiens de la Création... un histoire de chiot qui tourne en rond pour attraper sa queue en quelque sorte ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 19672 Messages

05 oct. 2011, 19:18

Quoique... je viens de tester ton jeu d'essai et la requête que je t'ai suggérée avec la variable en laissant la valeur « 1 » :
mysql>  -- On crée une variable pour définir une valeur identifiant un parent;
mysql> SET @p_id_parent = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> -- On exécute la requête qui prendra en compte la variable précédente;
mysql> SELECT
    ->   ce.id       AS id_parent,
    ->   ce.nom      AS nom_parent,
    ->   ce.affixe   AS affixe_parent,
    ->   ce.lof_pere AS id_pere_parent,
    ->   cp.id       AS id_enfant,
    ->   cp.nom      AS nom_enfant,
    ->   cp.affixe   AS affixe_enfant,
    ->   cp.lof_pere AS id_pere_enfant
    -> FROM chien AS         ce
    ->   LEFT JOIN chien AS  cp ON ce.lof_pere = cp.id
    -> WHERE cp.id = @p_id_parent;
Le résultat donne ceci :
+-----------+------------+-------------------------+----------------+-----------+------------+-------------------------+----------------+
| id_parent | nom_parent | affixe_parent           | id_pere_parent | id_enfant | nom_enfant | affixe_enfant           | id_pere_enfant |
+-----------+------------+-------------------------+----------------+-----------+------------+-------------------------+----------------+
|         1 | Vatan      | de la Cite des Foucault |              1 |         1 | Vatan      | de la Cite des Foucault |              1 |
+-----------+------------+-------------------------+----------------+-----------+------------+-------------------------+----------------+
1 row in set (0.02 sec)
Tu as testé quoi au juste ? :?
Modifié en dernier par Cyrano le 05 oct. 2011, 19:20, modifié 1 fois.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 790 Messages

05 oct. 2011, 19:20

si regarde plus haut je t'ai dis que j'avais une ligne avec l'id1
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Mammouth du PHP | 19672 Messages

05 oct. 2011, 19:21

Ben tu ne peux pas avoir davantage de résultat par rapport à ce que contient ta base, tu t'attendais à autre chose ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 790 Messages

05 oct. 2011, 19:24

en fait oui au moment ou j'ai dis que c’était bon je chercher a savoir comment inscrire ses valeurs dans la balise echo car j'ai des erreus: Notice: Undefined index: nom in C:\wamp\www\malivote\pedigre.php on line 110 partout...
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Mammouth du PHP | 19672 Messages

05 oct. 2011, 19:29

juliette, le plugin Boule-de-cristal 1.0 de Firefox n'est même pas encore en version alpha et on ne peut pas encore l'installer... donc je ne peux pas tout deviner.

Tu sembles dire que « oui tu t'attendais à autre chose » , soit, mais quoi ?

N'oublie jamais, une question bien posée, c'est un problème bien compris, ça représente au moins les 3/4 de la réponse. Si tu n'est pas claire et précise dans tes question, les réponses ont de fortes chances d'être tout aussi floues... J'ai repris un peu depuis le début, me demandant si je n'avais pas loupé une marche, mais au final la question n'a rien de très clair...
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 790 Messages

05 oct. 2011, 19:34

je t'explique ce que je veux pour être sur que je sois sur la bonne route

sur un moteur de recherche je cherche le pedigree d'chien A.
ce chien A, a dans son champ l'id de son père et de sa mère.

quand on clic sur ce chien A alors son pedigree s'affiche mais aussi quelques infos de ses parents puis de ses grands parents avec chaqun un lien pour voir leurs propres infos et les descendent.

je voudrais que si le chien A n'a pas de parents soit quand même affiche l'id de son père et de sa mère qui eux sont enregistrer dans son champ...
de cette façon si un visiteurs viens a ajouter un chien il n'auras pas forcement besoin d'ajouter aussi ses parants et les liaisons se feront automatiquement par le n° de lof de chaque chien...

désolé, c'est pas facile.
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Mammouth du PHP | 19672 Messages

05 oct. 2011, 19:58

Ben c'est déjà plus clair.

Mais ça implique que tu doives passer les colonnes lof_pere et lof_mere en NUL au lieu de NOT NULL parce que l'information n'est pas toujours disponible et tu ne peux pas mettre des données au hasard. Ça veut dire que dans un certain nombre de cas, tu n'auras pas les informations sur les parents d'un individu.

Et dans ce cas, il faudra passer par une requête externe pour obtenir quand même les informations sur ce même individu. Mais en relisant et en refaisant la requête, j'ai réalisé que j'avais introduit des erreurs dans la mienne.

Ton code de création de table devient ceci :
-- phpMyAdmin SQL Dump
-- version 3.3.9
-- http://www.phpmyadmin.net
--
-- Serveur: localhost
-- Généré le : Mer 05 Octobre 2011 à 15:36
-- Version du serveur: 5.5.8
-- Version de PHP: 5.3.5

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Base de données: `malivote`
--

-- --------------------------------------------------------
USE malivote;
--
-- Structure de la table `chien`
--

CREATE TABLE IF NOT EXISTS `chien` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `lof_pere` int(20) NULL,
  `lof_mere` int(20) NULL,
  `race` varchar(255) NOT NULL,
  `nom` varchar(32) NOT NULL,
  `affixe` varchar(40) NOT NULL,
  `sex` varchar(11) NOT NULL,
  `lof` varchar(32) NOT NULL,
  `puce` varchar(50) NOT NULL,
  `photo` varchar(50) NOT NULL,
  `nee` varchar(32) NOT NULL,
  `taille` varchar(32) NOT NULL,
  `poids` varchar(32) NOT NULL,
  `description` text NOT NULL,
  `d_inscription` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

--
-- Contenu de la table `chien`
--

INSERT INTO `chien` (`id`, `lof_pere`, `lof_mere`, `race`, `nom`, `affixe`, `sex`, `lof`, `puce`, `photo`, `nee`, `taille`, `poids`, `description`, `d_inscription`) VALUES
(1, NULL, NULL, 'Berger belge Malinois', 'Vatan', 'de la Cite des Foucault', '(M)', '00254855-00254', '000022558885122', '<Img src="images/vatan.PNG">', '12/12/2006', '63 cm', '33 Kg', 'Erat autem diritatis eius hoc quoque indicium nec obscurum nec latens, quod ludicris cruentis delectabatur et in circo sex vel septem aliquotiens vetitis certaminibus pugilum vicissim se concidentium perfusorumque sanguine specie ut lucratus ingentia laetabatur.', 0),
(2, NULL, NULL, 'Berger belge Malinois', 'vaBimbo', 'des deux sabres', '(F)', '2', '', '<Img src="images/bimbo.PNG">', '', '', '', '', 0),
(3, 1, 2, 'Berger belge Malinois', 'vaTop Gun', 'des Plaines de Thierache', '(M)', '1', '', '', '', '', '', '', 0);
Maintenant, quelques tests : tu cherches le pedigree du chien vaTop Gun, donc l'identifiant 3, ça donne ceci :
mysql> SET @p_id_chien = 3;
Query OK, 0 rows affected (0.03 sec)

mysql> SELECT
    ->   ce.nom      AS nom_chien,
    ->   ce.affixe   AS affixe_chien,
    ->   cp.nom      AS nom_pere,
    ->   cp.affixe   AS affixe_pere,
    ->   cm.nom      AS nom_mere,
    ->   cm.affixe   AS affixe_mere
    -> FROM chien AS         ce
    ->   LEFT JOIN chien AS  cp ON ce.lof_pere = cp.id
    ->   LEFT JOIN chien AS  cm ON ce.lof_mere = cm.id
    -> WHERE ce.id = @p_id_chien;
+-----------+--------------------------+----------+-------------------------+----------+-----------------+
| nom_chien | affixe_chien             | nom_pere | affixe_pere             | nom_mere | affixe_mere     |
+-----------+--------------------------+----------+-------------------------+----------+-----------------+
| vaTop Gun | des Plaines de Thierache | Vatan    | de la Cite des Foucault | vaBimbo  | des deux sabres |
+-----------+--------------------------+----------+-------------------------+----------+-----------------+
1 row in set (0.00 sec)
Essayons maintenant avec sa mère :
mysql> SET @p_id_chien = 2;
Query OK, 0 rows affected (0.05 sec)

mysql> SELECT
    ->   ce.nom      AS nom_chien,
    ->   ce.affixe   AS affixe_chien,
    ->   cp.nom      AS nom_pere,
    ->   cp.affixe   AS affixe_pere,
    ->   cm.nom      AS nom_mere,
    ->   cm.affixe   AS affixe_mere
    -> FROM chien AS         ce
    ->   LEFT JOIN chien AS  cp ON ce.lof_pere = cp.id
    ->   LEFT JOIN chien AS  cm ON ce.lof_mere = cm.id
    -> WHERE ce.id = @p_id_chien;
+-----------+-----------------+----------+-------------+----------+-------------+
| nom_chien | affixe_chien    | nom_pere | affixe_pere | nom_mere | affixe_mere |
+-----------+-----------------+----------+-------------+----------+-------------+
| vaBimbo   | des deux sabres | NULL     | NULL        | NULL     | NULL        |
+-----------+-----------------+----------+-------------+----------+-------------+
1 row in set (0.01 sec)
Et là, on a pas les parents, ce qui est somme toute normal alors qu'on les avait à la recherche précédente.

Tu pourrais aussi n'avoir qu'un seul des deux parents, c'est selon ce que tu auras enregistré ou non dans ta base.

Note au passage que là, la requête en auto-jointure devient triple puisque je récupère les informations à la fois sur le chien lui-même, sur son père et sur sa mère. J'utilise donc trois préfixes différents et donc trois alias différents de la même table, ce (chien enfant recherché), cp (chien père) et cm (chien mère).
Est-ce que c'est plus logique comme ceci ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 790 Messages

05 oct. 2011, 20:17

effectivement ca fonctionne correctement sur sql je vais tenter de l’intégré dans ma <?php echo pour essayer d'exploiter les données et le fils et les parents puis je reviendrais ajouté par la suite les grands parents le temps de manipulé un peut...
ce qui veux dire que ça fera 7 alias et 7 préfixe: c'est ça ?

merci a toi
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Mammouth du PHP | 19672 Messages

05 oct. 2011, 20:28

plus que ça puisque logiquement chaque individu a deux parents, à partir du chien enfant, tu auras deux parents et quatre grand parents, et là ça va devenir rock&roll au niveau des jointures, mais pourquoi pas, je te laisse faire la mise au point et des essais, tu me diras si tu coinces :)

Mais il te faudra ajouter des données valides dans ta base au préalable : pour les grands-parents par exemple, il faudra les ajouter avec pour eux même des identifiants de lof_pere et lof_mere NULL mais il faudra aussi mettre à jour le parent correspondant avec l'identifiant des grands parents nouvellement enregistrés. |*()
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 790 Messages

05 oct. 2011, 20:48

en fait le n°de lof est le numéro d’immatriculation d'un chien et avec chaque chien inscrit au lof, on remet un papier(lof ou pedigree) qui contient les n°de lof sur 3 génération et c'est le proprio du chien qui entreras ces informations, je lui permet de ne rentrer que son chien plus les lofs et non un pedigree complet...
quand quelqu'un d'autre enregistrera un de ses parents ils seront automatiquement lié par ce n° de lof non ?

si c'est le cas alors c'est parfait, c'est ce que je veux, de plus c'est le lof qui seras tester pour savoir si le chien doit être inscrit ou pas...

pour l'instant c'est moi qui entre les chiens justement parce que le système n'est pas complet, mais avant je voulais voir fonctionner.

je prend bonne note de ton conseil et je vais de suite intégré dans la bdd les infos grand parents et arriéré gp...

merci beaucoup...
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Mammouth du PHP | 19672 Messages

05 oct. 2011, 20:53

Ben sur un plan plus général, c'est pour ce genre de raison que je commence toujours par le back-office quand je construis une application : comme ça j'ai l'outil pour enregistrer des données valides, j'ai ensuite beaucoup moins de questions à me poser lorsque vient le temps de développer la partie front-office (le site internet public) et je sais que je disposerai de données valides.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 790 Messages

05 oct. 2011, 21:56

bon, c'est super: tout fonctionne correctement...
malgré tout, serat il possible de réouvrir ce poste par la suite pour l'ajout des nouveaux parents en cas de besoin ?

merci beaucoup !!!
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Mammouth du PHP | 19672 Messages

05 oct. 2011, 22:02

Ben si tout fonctionne, tant mieux, et si tu as assimilé la logique du fonctionnement, tu ne devrais pas avoir besoin de ré-ouvrir le sujet. Mais le cas échéant, rien ne t'empêchera de le faire si tu te heurtes à un imprévu.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 790 Messages

06 oct. 2011, 07:03

en fait, ca ne marchais pas:
quand j'ai voulu mettre de l'ordre dans les n°lof, les infos père et mère n'été plus présente:
j'ai changer de cette façon:
LEFT JOIN chien AS  cp ON ce.lof_pere = cp.lof
LEFT JOIN chien AS  cm ON ce.lof_mere = cm.lof
et la il me semble que tout va bien !
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.