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

SQLツリー階層を注文する

    パス列とトリガーを追加することで、これをかなり簡単に行うことができます。

    まず、ルートからノードへのパスを含むvarchar列を追加します。

    ALTER TABLE category ADD path VARCHAR(50) NULL;
    

    次に、挿入時にパスを計算するトリガーを追加します。

    (単に新しいIDを親のパスと連結します)

    CREATE TRIGGER set_path BEFORE INSERT ON category
      FOR EACH ROW SET NEW.path = 
      CONCAT(IFNULL((select path from category where id = NEW.parent_id), '0'), '.', New.id);
    

    次に、パスで並べ替えを選択します:

    SELECT name, path FROM category ORDER BY path;
    

    結果:

    pizza         0.1
    piperoni      0.1.4
    cheese        0.1.5
    extra cheese  0.1.5.7
    vegetariana   0.1.6
    burger        0.2
    coffee        0.3
    

    フィドル を参照してください。 。

    このようにして、メンテナンスコストも最小限に抑えられます。パスフィールドは挿入時に非表示になり、トリガーを介して計算されます。ノードのすべての子も削除されるため、ノードを削除してもオーバーヘッドはありません。唯一の問題は、ノードのparent_idを更新するときです。まあ、それをしないでください! :)



    1. SQL Server:VARCHAR(MAX)フィールドの無効なXML文字を置き換えます

    2. SELECTステートメントからのMySQLストアドプロシージャ変数

    3. sql_modeの特定の値を確認するにはどうすればよいですか?

    4. Postgresのヒントとコツ