Heim  >  Artikel  >  Datenbank  >  Detaillierte Erläuterung von 25 Codezeilen zur Implementierung der MySQL-Baumabfrage

Detaillierte Erläuterung von 25 Codezeilen zur Implementierung der MySQL-Baumabfrage

小云云
小云云Original
2018-01-29 13:27:082032Durchsuche

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

MySQL unter Verwendung von MYSQL Um Oracle zu implementieren, beginnen Sie mit der Verbindung durch rekursive Baumabfrage

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn