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

カテゴリツリーを返すMysqlクエリ

    単一のSQLクエリはありません これにより、このテーブル構造に基づいて期待どおりの順序で結果を得ることができます。

    この問題を解決するには、次の2つの方法があります。

    1. (DBの外部の)外部アプリケーションロジックを使用して、各カテゴリの子を検出し、アプリケーションでツリーを構築する再帰呼び出しを行います。

    2. リレーショナルデータベースにツリーデータを格納するためのアルゴリズムの1つを使用します。そのようなアルゴリズムの1つは、<と呼ばれます。 code>変更されたプレオーダーツリートラバーサル または単にMPTT。

    lftを使用すると仮定します およびrgt トラバーサルで左/右のインデックスを維持するには、新しいカテゴリを挿入するときに、次のことを行う必要があります。

    1. IDで親カテゴリ情報を取得します: SELECT lft、rgt FROM tbl_categories WHERE categoryId =5 例として、親カテゴリに lft =7があったと仮定します。 およびrgt=10 (この場合、すでに1人の子供がいます)

    2. 新しいエントリ用のスペースを確保します-すべてのレコードを2シフトします(lftの場合は1、rgtの場合は1):

      UPDATE tbl_categories SET rgt =rgt + 2 WHERE rgt> =10 ORDER BY rgt DESC

      UPDATE tbl_categories SET lft =lft + 2 WHERE lft> =10 ORDER BY lft DESC

    ここに注意してくださいORDER 降順。 lftとして およびrgt 一意であると想定される場合は、 UNIQUEを作成することをお勧めします それらに制約を課し、重複するキーエラーを防ぐために更新の降順が必要です。

    1. lft =を設定します およびrgt= 新しいレコードを挿入します...

      INSERT INTO tbl_categories SET categoryName ="New Child"、parentCategoryId =5、lft =11、rgt =12、...

    MPTT PHP MySQL を検索すると、コードを使用したより詳細な例を見つけることができます。 。このテーマに関するチュートリアルはかなりあります。



    1. MySQLインポートファイルで60秒または分以上

    2. 古いサーバーから新しいサーバーにすべてのMySQLデータベースを転送する方法

    3. conn.Open()を使用しようとしたときにC#MySQLSSL接続エラーが発生しました

    4. mysqlのifnullとcolesceの違いは何ですか?