Dieser Artikel teilt Ihnen hauptsächlich die detaillierte Erklärung des 25-zeiligen MySQL-Baum-Abfragecodes mit.
Anforderung: Alle untergeordneten Knoten unter der aktuellen (beliebigen) Ebene finden.
Erreicht durch benutzerdefinierte MySQL-Funktion, fügen Sie zuerst den Code ein und geben Sie später detaillierte Anweisungen:
delimiter $$ CREATE FUNCTION `getChildList`(rootId INT) RETURNS varchar(1024) BEGIN DECLARE childListStr VARCHAR(1024); DECLARE tempChildStr VARCHAR(1024); DECLARE rootIdStr VARCHAR(64); SET childListStr=NULL; SET rootIdStr=cast(rootId as CHAR); myloop: WHILE TRUE DO SELECT GROUP_CONCAT(id) INTO tempChildStr FROM test where FIND_IN_SET(parrent_id,rootIdStr)>0; IF tempChildStr IS NOT NULL THEN SET rootIdStr=tempChildStr; IF childListStr IS NULL THEN SET childListStr=tempChildStr; ELSE SET childListStr=concat(childListStr,',',tempChildStr); END IF; ELSE LEAVE myloop; END IF; END WHILE; RETURN childListStr; END $$
Tabellen-SQL erstellen:
CREATE TABLE `test` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `parrent_id` int(11) DEFAULT '0', `name` varchar(32) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8; +------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+------------------+------+-----+---------+----------------+ | id | int(11) unsigned | NO | PRI | NULL | auto_increment | | parrent_id | int(11) | YES | | 0 | | | name | varchar(32) | YES | | NULL | | +------------+------------------+------+-----+---------+----------------+ +----+------------+------+ | id | parrent_id | name | +----+------------+------+ | 1 | 0 | cg1 | | 2 | 1 | cg2 | | 3 | 2 | cg3 | | 4 | 3 | cg4 | | 5 | 4 | cg5 | | 6 | 5 | cg6 | | 7 | 6 | cg7 | | 8 | 7 | cg8 | | 9 | 8 | cg9 | | 10 | 1 | cg10 | | 11 | 2 | cg11 | +----+------------+------+
Zeile 1:
Wenn das Trennzeichen den Inhalt des Funktionskörpers schreibt, müssen Sie zuerst das Schlüsselwort DELIMITER verwenden, um das Trennzeichen in etwas anderes zu ändern. Andernfalls wird es beim Schreiben einer Anweisung direkt ausgeführt, wenn Sie „;“ schreiben, was dazu führt, dass die Funktion ausgeführt wird Fehler beim Schreiben
Zeilen 2-4: Syntaxspezifikationen für MySQL-Funktionen, nicht viele Erklärungen
Zeilen 5-9: Definieren Sie die für die Logik erforderlichen Variablen.
childListStr: Der zuletzt zurückgegebene untergeordnete Knoten ids_str (zum Beispiel: „1,2,3,4,5“).
tempChildStr: Temporärer untergeordneter Knoten ids_str (zum Beispiel: „1“).
rootIdStr: Konvertieren Sie den Eingabestammknoten in den Typ char.
Zeilen 10-23: Der kritischste Teil der gesamten Funktion ist die Verarbeitung von tempChildStr in while und das Verständnis der integrierten Funktionen GROUP_CONCAT und FIND_IN_SET
每一次循环,通过 GROUP_CONCAT函数找出输入的根节点的直接下级节点,通过GROUP_CONCAT函数得到这些子节点的id组成的字符串。并将这次得到的子字符串作为根节点,去寻找下一级的所有的子节点。 最后找到最后子节点没有下级时候,tempChildStr IS NOT NULL。退出循环,返回结果。
Betriebsergebnisse :
mysql> select getChildList(1); +-----------------------+ | getChildList(1) | +-----------------------+ | 2,10,3,11,4,5,6,7,8,9 | +-----------------------+ 1 row in set (0.00 sec) mysql> select getChildList(2); +------------------+ | getChildList(2) | +------------------+ | 3,11,4,5,6,7,8,9 | +------------------+ 1 row in set (0.00 sec)
Verwandte Empfehlungen:
SQL-Anweisung zur Implementierung eines klassischen Beispiels für eine Nachkommenbaumabfrage
Oracle-Baumabfrage und verwandte Funktionen
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung von 25 Codezeilen zur Implementierung der MySQL-Baumabfrage. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!