Struktura bazy:
Kod
mysql> describe tabdocumenttree;
+--------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+----------------+
| idnode | int(11) | NO | PRI | NULL | auto_increment |
| sname | varchar(250) | NO | | NULL | |
| nleft | int(11) | NO | | NULL | |
| nright | int(11) | NO | | NULL | |
| nlevel | int(11) | NO | | NULL | |
+--------+--------------+------+-----+---------+----------------+
+--------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+----------------+
| idnode | int(11) | NO | PRI | NULL | auto_increment |
| sname | varchar(250) | NO | | NULL | |
| nleft | int(11) | NO | | NULL | |
| nright | int(11) | NO | | NULL | |
| nlevel | int(11) | NO | | NULL | |
+--------+--------------+------+-----+---------+----------------+
Jedyne co udało mi się napisać, to pobranie wszystkich elementów, które posiadają rodzeństwo. Mi zależy na pobraniu tylko elementów dla zadanego idnode.
SELECT node.* FROM tabdocumenttree AS parent, tabdocumenttree AS node WHERE node.nleft > parent.nleft AND node.nright < parent.nright AND parent.nlevel = (node.nlevel - 1)
Jakieś sugestie?
edit
Czasami wystarczy wytłumaczyć komuś o co chodzi i rozwiązanie samo się nasuwa na myśl. Dodałem jeszcze jedno zapytanie i zrobiłem z tego procedurę.
DELIMITER $$ DROP PROCEDURE IF EXISTS `cms`.`documenttree_get_siblings`$$ CREATE PROCEDURE `cms`.`documenttree_get_siblings` (IN nodeId INT) BEGIN DECLARE parentLeft, parentRight, parentLevel INTEGER; SELECT parent.nleft, parent.nright, parent.nlevel INTO parentLeft, parentRight, parentLevel FROM tabdocumenttree AS parent, tabdocumenttree AS node WHERE node.idnode = nodeId AND node.nleft > parent.nleft AND node.nright < parent.nright AND parent.nlevel = (node.nlevel - 1); SELECT * FROM tabdocumenttree WHERE nleft > parentLeft AND nright < parentRight AND nlevel = parentLevel + 1; END$$ DELIMITER ;
Jak na razie działa bez zarzutu. Może znacie jakieś prostsze rozwiązanie?