Wenn Sie eine SELECT-Funktion haben möchten, ohne dass die übergeordnete ID niedriger als die untergeordnete ID sein muss, kann eine Funktion verwendet werden. Es unterstützt auch mehrere Kinder (wie es ein Baum tun sollte) und der Baum kann mehrere Köpfe haben. Es wird auch sichergestellt, dass eine Unterbrechung auftritt, wenn eine Schleife in den Daten vorhanden ist.
Ich wollte dynamisches SQL verwenden, um die Tabellen- / Spaltennamen übergeben zu können, aber Funktionen in MySQL unterstützen dies nicht.
DELIMITER $$
CREATE FUNCTION `isSubElement`(pParentId INT, pId INT) RETURNS int(11)
DETERMINISTIC
READS SQL DATA
BEGIN
DECLARE isChild,curId,curParent,lastParent int;
SET isChild = 0;
SET curId = pId;
SET curParent = -1;
SET lastParent = -2;
WHILE lastParent <> curParent AND curParent <> 0 AND curId <> -1 AND curParent <> pId AND isChild = 0 DO
SET lastParent = curParent;
SELECT ParentId from `test` where id=curId limit 1 into curParent;
IF curParent = pParentId THEN
SET isChild = 1;
END IF;
SET curId = curParent;
END WHILE;
RETURN isChild;
END$$
Hier muss die Tabelle test
an den realen Tabellennamen angepasst werden und die Spalten (ParentId, Id) müssen möglicherweise an Ihre realen Namen angepasst werden.
Verwendung :
SET @wantedSubTreeId = 3;
SELECT * FROM test WHERE isSubElement(@wantedSubTreeId,id) = 1 OR ID = @wantedSubTreeId;
Ergebnis:
3 7 k
5 3 d
9 3 f
1 5 a
SQL für die Testerstellung:
CREATE TABLE IF NOT EXISTS `test` (
`Id` int(11) NOT NULL,
`ParentId` int(11) DEFAULT NULL,
`Name` varchar(300) NOT NULL,
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
insert into test (id, parentid, name) values(3,7,'k');
insert into test (id, parentid, name) values(5,3,'d');
insert into test (id, parentid, name) values(9,3,'f');
insert into test (id, parentid, name) values(1,5,'a');
insert into test (id, parentid, name) values(6,2,'o');
insert into test (id, parentid, name) values(2,8,'c');
EDIT: Hier ist eine Geige , um es selbst zu testen. Es hat mich gezwungen, das Trennzeichen mit dem vordefinierten zu ändern, aber es funktioniert.