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

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 : [resolu] 2 requête en une, comment faire ?

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

par juliette » 10 oct. 2011, 22:22

encore merci pour tout, ça fonctionne bien: 78 critères et 14 jointures...
je dois maintenant faire une jointure sur une 2eme table, et je cherche un tuto simple sur la façon d’intégré cette nouvelle table.

merci d'avance.

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

par juliette » 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 !

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

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

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

par juliette » 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 !!!

Re: 2 requête en une, comment faire ?

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

Re: 2 requête en une, comment faire ?

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

Re: 2 requête en une, comment faire ?

par Cyrano » 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. |*()

Re: 2 requête en une, comment faire ?

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

Re: 2 requête en une, comment faire ?

par Cyrano » 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 ?

Re: 2 requête en une, comment faire ?

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

Re: 2 requête en une, comment faire ?

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

Re: 2 requête en une, comment faire ?

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

Re: 2 requête en une, comment faire ?

par Cyrano » 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 ?

Re: 2 requête en une, comment faire ?

par juliette » 05 oct. 2011, 19:20

si regarde plus haut je t'ai dis que j'avais une ligne avec l'id1

Re: 2 requête en une, comment faire ?

par Cyrano » 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 ? :?