Bonjour à tous,

J'ai construit un menu sur base de la représentation intervallaire, mais je suis confronté à un problème dont je n'arrive pas à sortir vainqueur.

Car il se trouve que pour ce menu, j'ai des options "publier oui ou non" et un priviliège d'accès, ceci pour chaque ligne du menu.

Or, si j'ai un nœud qui n'est pas publié ou dont l'accès est interdit, il faudrait que ses enfants n'apparaissent pas non plus, évidemment - question de hiérarchie.

Quelqu'un peut-il m'éclairer :

Voici les tables

Les données des menu


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE IF NOT EXISTS `menu_donnees` (
  `id` int(11) NOT NULL auto_increment,
  `idType` int(3) NOT NULL default '0',
  `cible` varchar(10) NOT NULL default '',
  `publie` tinyint(1) NOT NULL default '0',
  `privilege` int(1) default '0',
  `bg` int(11) NOT NULL,
  `bd` int(11) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `ordre` (`ordre`),
  KEY `idType` (`idType`)
) ENGINE=MyISAM ;


les infos des menus par langue



Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE IF NOT EXISTS `menu_langue` (
  `idMenu` int(11) NOT NULL auto_increment,
  `idData` int(3) NOT NULL default '0',
  `codeLg` tinyint(1) NOT NULL default '1',
  `lien` varchar(150) NOT NULL default '',
  `nom` varchar(150) default NULL,
  `alias` varchar(150) NOT NULL default '',
  `image` varchar(50) NOT NULL default '',
  `image_over` varchar(50) NOT NULL default '',
  `image_active` varchar(50) NOT NULL,
  `varparams` mediumtext NOT NULL,
  `defini` tinyint(1) NOT NULL default '0',
  PRIMARY KEY  (`idMenu`)
)  ;

La requete (qui fonctionne, mais bof… ) :


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
select * FROM uc_menu_lg c    
   INNER JOIN uc_menu_data d ON c.idData=d.id AND c.codeLg=1 
 
WHERE privilege = 1 AND defini=1 AND publie =1 AND d.idType =1 
AND idData NOT IN 
     (SELECT idData FROM uc_menu_data , 
           ( SELECT bg,bd from uc_menu_data d WHERE (publie =0 OR privilege !=1) ) AS non     
           WHERE (d.bg > non.bg AND d.bd < non.bd ) 
     )
 
ORDER BY d.bg
Cette requete sql fonctionne, mais elle ne me semble pas fort élégante, et de plus, elle fait appel à un autre élément (idData) que les bornes gauches et droite.