6. SELECT level1.title AS lev1Title, level2.title as lev2Title, level3.title as lev3Title, level4.title as lev4Title FROM adjacentList AS level1 LEFT JOIN adjacentList AS level2 ON (level2.parentSerial = level1.categorySerial) LEFT JOIN adjacentList AS level3 ON (level3.parentSerial = level2.categorySerial) LEFT JOIN adjacentList AS level4 ON (level4.parentSerial = level3.categorySerial) WHERE level4.categorySerial = '6'; +--------------+-------------------+--------------+------------+ | lev1Title | lev2Title | lev3Title | lev4Title | +--------------+-------------------+--------------+------------+ | Home Theatre | Surround Sound | Speaker | Satellites | +--------------+-------------------+--------------+------------+ Path details: Self Joins
7.
8. The tree again… Home Theatre Projectors Surround Sound Sub Woofers Satellites Speakers
12. function getPathDetails( $categorySerial , $pathDetails = array ()) { $sql = "SELECT parent.title FROM productCategories AS node, productCategories AS parent WHERE parent.leftNode <= node.leftNode AND parent.rightNode >= node.rightNode AND node.categorySerial = '" . $categorySerial . "' ORDER BY parent.leftNode DESC" ; $result = $this ->dbase->query( $sql ) ; $pathDetails = array () ; while ( $row = $result ->fetchAssoc( $result )) { $pathDetails [] = $row [ 'title' ] ; } return ( $pathDetails ) ; } Projectors: getPathDetails(2); [0] => Projectors [1] => Home Theatre Satellites: getPathDetails(6); [0] => Satellites [1] => Speakers [2] => Surround Sound [3] => Home Theatre Path details: Revisited
13. function getDescendants( $categorySerial ) { $sql = "SELECT node.title FROM productCategories AS node, productCategories AS parent WHERE node.leftNode BETWEEN parent.leftNode AND parent.rightNode AND parent.categorySerial = '" . $categorySerial . "' AND node.categorySerial != '". $categorySerial ."' ORDER BY node.leftNode ASC" ; $result = $this ->dbase->query( $sql ) ; $pathDetails = array () ; while ( $row = $result ->fetchAssoc( $result )) { $pathDetails [] = $row [ 'title' ] ; } return ( $pathDetails ) ; } Speakers: getDescendants(5); [0] => Satellites Surround Sound: getDescendants(3); [0] => Speakers [1] => Satellites [2] => Sub Woofers Getting Category Descendants
14. START TRANSACTION SELECT @myLeft := leftNode FROM productCategories WHERE categorySerial = '$parentSerial' LIMIT 0,1 UPDATE productCategories SET rightNode = rightNode + 2 WHERE rightNode > @myLeft UPDATE productCategories SET leftNode = leftNode + 2 WHERE leftNode > @myLeft INSERT INTO productCategories SET leftNode = @myLeft + 1, rightNode = @myLeft + 2, title = 'NEW CATEGORY', parentSerial = '$parentSerial' COMMIT Adding Nodes
15. START TRANSACTION SELECT @myLeft := IF(MAX(rightNode) IS NULL, 0, MAX(rightNode)) FROM productCategories WHERE parentSerial = '0' LIMIT 0,1 INSERT INTO productCategories SET leftNode = @myLeft + 1, rightNode = @myLeft + 2, title = 'NEW CATEGORY', parentSerial = '$parentSerial' COMMIT Adding Primary Nodes
16. START TRANSACTION SELECT @myLeft := leftNode, @myRight := rightNode, @myWidth := rightNode - leftNode + 1 FROM productCategories WHERE categorySerial = '$categorySerial' LIMIT 0,1"; DELETE FROM productCategories WHERE leftNode BETWEEN @myLeft AND @myRight UPDATE productCategories SET rightNode = rightNode - @myWidth WHERE rightNode > @myRight UPDATE productCategories SET leftNode = leftNode - @myWidth WHERE leftNode > @myLeft COMMIT Delete a node & its children
17.
18.
19. Thankyou Special thanks to Arjen Lentz, Jonathan Oxer and Mike Hellyer for edumacating me. Questions?