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

カテゴリとその子のすべてのアイテムを取得します

    ほとんどの場合、入れ子集合を実行することをお勧めします。設定するのは少し難しいですが、クエリを非常に簡単にします。したがって、カテゴリの親の代わりに、2つの列(lft)があります。 およびrgt 。左と右は基本的にカテゴリの境界です。アイテムのカテゴリIDがこれらの値の間にある場合、そのカテゴリの子であることがわかります。

    +----+---------------+-----+------+
    | id | category name | lft | rgt  |
    +----+---------------+-----+------+
    | 1  | cars          |  1  |  24  |
    +----+---------------+-----+------+
    | 2  | bmw           |  2  |  3   |
    +----+---------------+-----+------+
    | 5  | audi          |  4  | 23   |
    +----+---------------+-----+------+
    | 6  | 100           |  5  |  6   |
    +----+---------------+-----+------+
    | 7  | 80            |  7  |  8   |
    +----+---------------+-----+------+
    | 8  | A4            |  9  | 22   |
    +----+---------------+-----+------+
    | 9  | TDI           |  10 | 11   |
    +----+---------------+-----+------+
    | 10 | Quatro        |  12 | 21   |
    +----+---------------+-----+------+
    | 11 | Black         |  13 | 18   |
    +----+---------------+-----+------+
    | 12 | White         |  19 |  20  |
    +----+---------------+-----+------+
    | 13 | 2 doors       |  14 |  15  |
    +----+---------------+-----+------+
    | 14 | 5 doors       |  16 | 17   |
    +----+---------------+-----+------+
    

    次に、車のカテゴリのアイテム数を取得するには、次のように非常に簡単に行うことができます。

    SELECT categories.name, items.id, items.category_id, items.name 
    FROM categories 
    LEFT JOIN items 
        ON (items.category_id BETWEEN categories.lft AND categories.rgt)
    WHERE categories.category_name = 'cars'
    

    もちろん、category_nameの値を変更するだけです。 任意のカテゴリのアイテムを取得します。

    申し訳ありませんが、ここにアップロードしたときに何らかの理由で画像が回転しましたが、カテゴリを円で描いてから線に番号を付けると、左右の値がわかります。

    他のカテゴリーを取得するために外挿できると思ったので、私は車だけをしました。

    したがって、次のようにカテゴリを書き出す場合:

    Cars(BMW(), Audi(100(),80(),A4(TDI(),Quatro(Black(2dr(),5dr()), White())))
    

    次に、括弧に数字のラベルを付けることができます:

    Cars[1]->(BMW[2]->()<-[3], Audi[4]->(100[5]->()<-[6],80[7]->()<-[8],A4[9]->(TDI[10]->()<-[11],Quatro[12]->(Black[13]->(2dr[14]->()<-[15], 5dr[16]->()<-[17])<-[18], White[19]->()<-[20])<-[21])<-[22])<-[23])<-[24]
    

    または、ツリーとしてグラフ化する場合は、次のようにラベルを付けることができます。この場合、左端のノードに番号を付け、すべての子にラベルを付けた場合にのみ右ノードにラベルを付けます。



    1. SQLServerの基本ALTERTABLEステートメント

    2. MySQLのパフォーマンス:MySQLとMariaDB

    3. MySQLレプリケーションからMySQLGaleraCluster4.0に移行するためのヒント

    4. mysqlDataSourceを使用したjavax.naming.NoInitialContextException