Seçilen düğüm yukarıya, iç içe setleri ile bir navigasyon bina

1 Cevap php

Ben LFT ile iç içe setleri kullanarak aşağıdaki ağaç yapıya sahip & rgt değerleri.

node
    node
        node
    node
        node (selected)
        node
node
node
    node

Ağacı sadece seçili düğümün yolu, genişletilir ve sigara ilgili düğümler / gizli çökmüş böylece ben bir navigasyon kurmak istiyorum.

, Aşağıdaki gibi yöntem kullanılarak, ağaç çıktılanır olacaktır:

node
    node
    node
        node (selected)
        node
node
node

Bu php / mysql kullanarak mümkündür? Herhangi bir sql uzmanları bir sorgu oluşturmak yardımcı olabilir ben çok minnettar olurdum.?

Ben seviye başına fazladan sorgusu gerekiyorsa ben umursamıyorum, onun muhtemelen sadece derin en fazla 4 veya 5 seviyeleri olacak ...

Düğümleri Tablonun Bakış:

--
-- Table structure for table `exp_node_tree_1`
--

CREATE TABLE `exp_node_tree_1` (
  `node_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  `lft` mediumint(8) unsigned DEFAULT NULL,
  `rgt` mediumint(8) unsigned DEFAULT NULL,
  `moved` tinyint(1) NOT NULL,
  `label` varchar(255) DEFAULT NULL,
  `entry_id` int(10) DEFAULT NULL,
  `template_path` varchar(255) DEFAULT NULL,
  `custom_url` varchar(250) DEFAULT NULL,
  `extra` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`node_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=18 ;

--
-- Dumping data for table `exp_node_tree_1`
--

INSERT INTO `exp_node_tree_1` VALUES(1, 1, 12, 0, 'Home', 1, '0', '/', '');
INSERT INTO `exp_node_tree_1` VALUES(5, 10, 11, 0, 'About Us', 2, '4', '', '');
INSERT INTO `exp_node_tree_1` VALUES(6, 6, 9, 0, 'Team', 3, '5', '', '');
INSERT INTO `exp_node_tree_1` VALUES(7, 3, 4, 0, 'Contact Us', 4, '4', '', '');
INSERT INTO `exp_node_tree_1` VALUES(8, 7, 8, 0, 'Awards', 5, '5', '', '');
INSERT INTO `exp_node_tree_1` VALUES(10, 2, 5, 0, 'New Page', 6, '4', '', '');

Teşekkür ederiz!

1 Cevap

Sizin örnek veriler kök düğümün doğrudan çocukları olmayan herhangi kardeş düğümleri yok verilen, zor yapar, ama ben orada ne çalışacağız :)

'Ana' kardeşler kapmak için önceki çağrı / doğru değerleri sola kullanmak için seçilen düğümün sol / sağ değerleri içeren bütün düğümleri kapmak için bir ve tek - ben iki SQL aramaları gerekir düşünmek istiyorum Seçtiğiniz düğümün

e.g. Grab all the nodes that contain the left/right values of your target node

SELECT e.* FROM exp_node_tree_1 as e, (SELECT lft, rgt FROM exp_node_tree_1 WHERE node_id = ?) AS tbl WHERE (e.lft < tbl.lft) and (e.rgt > tbl.rgt) ORDER BY e.lft ASC

Değiştirilsin mi? Seçilen düğümün node_id ile. , Bu üst düzeyde başlayan ve seçilen düğümün direkt üst aşağı çalışan, seçtiğiniz düğümün tüm atalarını döndürür

İkinci sorgu (kardeşler) zaten iade lft / rgt değerlerini (örn. PHP değerleri kapma) kullanmak istiyorsanız bağlı iki yol, bitmiş veya SQL ağır kaldırma yapmak isteyip istemediğinizi olabilir. SQL yapıyor sorgu daha karmaşık olduğu anlamına gelir, ama seçilen düğümün kimliği dışında herhangi bir veri gerekmez

Seçilen düğümün anne PHP değerleri kullanarak (önceki sorguda döndürülen)

SELECT * FROM `exp_node_tree_1` WHERE (lft > ?) AND (rgt < ?) ORDER BY lft ASC

İlk değiştirin? ebeveynin lft değeri ve ikinci ile? ebeveynin rgt değeri ile

İkinci yöntem sadece seçili düğümün node_id kullanır

select s.* FROM exp_node_tree_1 as s, (SELECT e.lft, e.rgt FROM exp_node_tree_1 as e, (SELECT lft, rgt FROM exp_node_tree_1 WHERE node_id = ?) AS tbl WHERE (e.lft < tbl.lft) and (e.rgt > tbl.rgt) ORDER BY e.lft DESC LIMIT 1) as parent WHERE (s.lft > parent.lft) AND (s.rgt < parent.rgt) ORDER BY s.lft ASC

Dediğim gibi - biraz daha karmaşık. Değiştirilsin mi? Seçilen düğümün node_id ile

Bu yardımcı olur umarım!