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 ?