Page 1 sur 1

affichage hiérarchique

Posté : 08 sept. 2008, 19:04
par dunbar
Bonsoir,

J'ai comme un petit soucis je vous explique c'est un exemple :wink: .
J'ai deux tables table_1 et table_2
Dans ma table_1 j'ai un server qui porte par exemple le numéro OS007
Et dans ma TABLE_2 j'ai des pc qui dépende du server OS007 et qui eux porte le numéro OS007a, OS007b, OS007c etc..
Alors mon soucis est que je ne trouve pas le moyen d'afficher OS007 et ces 3 petit.

Merci d'avance de me donner une piste :wink:

Posté : 08 sept. 2008, 19:20
par sadeq
C'est quoi la structure de tes tables (champs et lien entre tables) ?

Posté : 08 sept. 2008, 19:54
par dunbar
C'est quoi la structure de tes tables (champs et lien entre tables) ?
Comme je n'avais pas d'idée j'ai commencer par des test donc je n'ai pas vraiment de structure je voulais des avis avant de faire mes tables.
Donc je suis preneur de toute idée en notant que je voudrais pouvoir relier les server et sous server mais également les server entre eux par exemple le OM26 va avec le OM27 ET le OM25
CREATE TABLE `ampli_distri` (
`id_distri` int(10) NOT NULL auto_increment,
`number_distri` varchar(10) NOT NULL,
PRIMARY KEY (`id_distri`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

--
-- Contenu de la table `ampli_distri`
--

INSERT INTO `ampli_distri` (`id_distri`, `number_distri`) VALUES
(1, 'OM26a'),
(2, 'OM26b'),
(3, 'OM26c'),
(4, '27');

-- --------------------------------------------------------

--
-- Structure de la table `ampl_lm`
--

CREATE TABLE `ampl_lm` (
`id_lm` int(10) NOT NULL auto_increment,
`number` varchar(10) NOT NULL,
PRIMARY KEY (`id_lm`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

--
-- Contenu de la table `ampl_lm`
--

INSERT INTO `ampl_lm` (`id_lm`, `number`) VALUES
(1, '0'),
(2, '0'),
(3, 'OM26'),
(4, 'OM27');
En gros l'idée serait de cliquer sur OM26 et voir apparaître
OM25
|
|
|
OM26 --> OM26a --> OM26b --> OM26c
|
|
|
OM27

Posté : 09 sept. 2008, 00:19
par sadeq
J'ai une idée.

Tu mets une seule table pour stocker les infos des tes serveurs quelque soit leur rang dans la
hiérarchie et pour distinguer les fils des parents tu ajoute dans cette même table un champ
"id_parent" qui désigne l'id du serveur père d'un serveur fils. Les serveurs pères suprêmes n'ayant
pas de père se voit attribués la valeur NULL dans leur champ "id_parent"

En ce qui concerne le lien non hiérarchique qui peut exister entre serveurs de même rang, il faut
créer une seconde table où on peut associer les serveurs amis deux à deux sachant que pour une
liaison bidirectionnelle on aura 2 enregistrements maxi pour 2 même serveurs associés et pour les
liaisons unidirectionnelle on en aura 1 enregistrement maxi. Mais bon en s'en fou pour l'instant.

Voici donc la structure de cette solution, agrémentée par 2 requêtes qui vérifient l'objectif à savoir :
  • La liste des serveurs amis ayant un rang hiérarchique équivalent (server_to_server_list)
    Le liste des sous-serveurs reliés hiérarchiquement à leurs parents (child_parent_server_list)
Script SQL:

Code : Tout sélectionner

-- phpMyAdmin SQL Dump -- version 2.11.6 -- http://www.phpmyadmin.net -- -- Serveur: localhost -- Généré le : Mar 09 Septembre 2008 à 00:05 -- Version du serveur: 5.0.51 -- Version de PHP: 5.2.6 SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; -- -- Base de données: `test` -- -- -------------------------------------------------------- -- -- Structure de la table `server` -- -- Création: Lun 08 Septembre 2008 à 23:16 -- CREATE TABLE `server` ( `id` int(10) NOT NULL auto_increment, `number` varchar(10) NOT NULL, `id_parent` int(11) default NULL, PRIMARY KEY (`id`), KEY `id_parent` (`id_parent`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ; -- -- Contenu de la table `server` -- INSERT INTO `server` (`id`, `number`, `id_parent`) VALUES (1, 'OM25', NULL), (2, 'OM26', NULL), (3, 'OM27', NULL), (4, 'OM26a', 2), (5, 'OM26b', 2), (6, 'OM26c', 2); -- -------------------------------------------------------- -- -- Structure de la table `server_to_server` -- -- Création: Lun 08 Septembre 2008 à 23:16 -- CREATE TABLE `server_to_server` ( `id_server1` int(10) NOT NULL, `id_server2` int(10) NOT NULL, PRIMARY KEY (`id_server1`,`id_server2`), KEY `id_server2` (`id_server2`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- -- Contenu de la table `server_to_server` -- INSERT INTO `server_to_server` (`id_server1`, `id_server2`) VALUES (2, 1), (3, 1), (1, 2), (3, 2), (1, 3), (2, 3); -- -------------------------------------------------------- -- -- Structure de la vue `child_parent_server_list` -- CREATE VIEW `child_parent_server_list` AS select `s1`.`id` AS `id`,`s1`.`number` AS `number`,`s1`.`id_parent` AS `id_parent`,`s2`.`number` AS `number_parent` from (`test`.`server` `s1` join `test`.`server` `s2` on((`s1`.`id_parent` = `s2`.`id`))) where (`s1`.`id_parent` is not null) order by `s1`.`id_parent`,`s1`.`id`; -- -------------------------------------------------------- -- -- Structure de la vue `server_to_server_list` -- CREATE VIEW `server_to_server_list` AS select distinct `s`.`id` AS `id`,`s`.`number` AS `number`,if((`r`.`id_server1` <> `s`.`id`),`r`.`id_server1`,`r`.`id_server2`) AS `friend` from (`test`.`server` `s` join `test`.`server_to_server` `r` on(((`s`.`id` = `r`.`id_server1`) or (`s`.`id` = `r`.`id_server2`)))) where isnull(`s`.`id_parent`) order by `s`.`id`; -- -- Contraintes pour les tables exportées -- -- -- Contraintes pour la table `server` -- ALTER TABLE `server` ADD CONSTRAINT `server_ibfk_1` FOREIGN KEY (`id_parent`) REFERENCES `server` (`id`) ON DELETE SET NULL ON UPDATE CASCADE; -- -- Contraintes pour la table `server_to_server` -- ALTER TABLE `server_to_server` ADD CONSTRAINT `server_to_server_ibfk_1` FOREIGN KEY (`id_server1`) REFERENCES `server` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, ADD CONSTRAINT `server_to_server_ibfk_2` FOREIGN KEY (`id_server2`) REFERENCES `server` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

Posté : 09 sept. 2008, 15:57
par dunbar
Merci @sadeq ton idée me semble pas mal :wink: je vais étudier ta solution.

Entre temp j'ai essayer avec une jointure comme ceci:
//Numéro parent pour le test//
$numero = "OM26";
//Numéro pour le test affiche les enfants OM26a, OM26b, OM26c//
$number = $numero."_%";


                      $sql_aff = "SELECT
                                     al.number,al.id_lm, ad.number_distri, ad.id_distri
                                  FROM
                                     ampl_lm al, ampli_distri ad
                                  WHERE
                                      al.number = '".$numero."'
                                  AND
                                      ad.number_distri
                                  LIKE
                                     '".$number."'
                                  ";
Comme je ne sais pas savoir combient d'enfant va avoir un parent ma seule contraite est que le parent soit encoder xxx et les enfants xxx??? et cela fonctionne de plus je ne voie pas comment ont pourrais encore optimiser la requête
Franchement merci pour ton aide :wink: