sql >> データベース >  >> RDS >> Mysql

MySQLはすべての親を再帰的に検索します

    アイデアをあげましょう。指定されたIDからparent_idを何度も取得する関数を作成し、それを生成と呼びましょう。 Cat10世代1は親であり、CAT5世代2はCAT3などです。

    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 ;
    

    与えられた関数をテストする場合、CAT10のCategory_Id=10と仮定します

    select getNameIdGeneration(10, 2);
    

    CAT3

    必要なのは、系統を知りたいCATのIDを含むテーブルだけです

    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. OracleのCOLLATION()関数

    2. PHP環境の別のクエリで1つのMySQLクエリの結果を使用する

    3. RowDataPacketオブジェクトにアクセスする方法

    4. 長さのないキー仕様が原因でエラーが発生するSlick3.0スキーマ作成を回避する方法