sql >> Database >  >> RDS >> Mysql

MySQL vindt alle ouders recursief

Laat me je een idee geven. Maak een functie die de parent_id een aantal keren van een gegeven ID haalt, laten we het generatie noemen. Cat10 generatie 1 zou de ouder zijn en CAT5 generatie 2 zou CAT3 zijn, enzovoort.

DROP FUNCTION IF EXISTS getNameIdGeneration;
DELIMITER $$
CREATE FUNCTION getNameIdGeneration(idPar int, generationPar int)
  RETURNS VARCHAR(1000) READS SQL DATA
BEGIN
  DECLARE auxLoopVar INT default 0;
  DECLARE parentIdVar INT default idPar;  
  DECLARE nameVar VARCHAR(1000) default NULL;

  count_loop: LOOP    
    SELECT parent_id INTO parentIdVar FROM Category_parent WHERE Category_id = parentIdVar;
    SET auxLoopVar = auxLoopVar + 1;        
    IF auxLoopVar >= generationPar THEN
      LEAVE count_loop;
    END IF;    
  END LOOP;
  SELECT name INTO nameVar FROM Category WHERE id = parentIdVar;

  RETURN nameVar;
END;
$$
DELIMITER ;

ervan uitgaande dat Category_Id voor CAT10 =10 als u de gegeven functie test

select getNameIdGeneration(10, 2);

CAT3

Nu heb je alleen nog een tabel nodig die het ID bevat van de CAT waarvan je de afstamming wilt weten

MariaDB [mydatabase]> select * from test;
+-------------+------------+
| category_id | generation |
+-------------+------------+
|          10 |          1 |
|          10 |          2 |
|          10 |          3 |
+-------------+------------+

MariaDB [mydatabase]> select generation, getNameIdGeneration(category_id, generation) as Name from test;
+------------+------+
| generation | Name |
+------------+------+
|          1 | CAT5 |
|          2 | CAT3 |
|          3 | CAT1 |
+------------+------+
3 rows in set (0.00 sec)



  1. Exact tijdsverschil verkrijgen uit het MYSQL datetime-veld

  2. Toestaan ​​dat slechts 3 rijen worden toegevoegd aan een tabel voor een specifieke waarde

  3. automatisch ophogen van de primaire waardoor er gaten in het tellen blijven

  4. Hoe SIN() werkt in MariaDB