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

MySQL:親子をクエリする方法は?

    ここに1つのアイデアがあります。しかし、それはデータの設定方法に関する多くの仮定に基づいています。ツリーの下でIDを増やし続け、2つのレベルのみなど。

    SELECT f.foo_id,f.foo_parent_id FROM foo f
    foo f
    

    --parent_idsの上位X個を教えてください(これは良いことです。表示する親レベルの数を変更するには、LIMIT 10を調整するだけです)

    INNER JOIN 
    (select foo_id from foo where foo_parent_id is null order by foo_parent_id 
    LIMIT 10
    ) top_foo_parent
          on isnull(f.foo_parent_id,f.foo_id) = top_foo_parent.foo_id
    WHERE
    

    (この部分は、2人の子供を乗り越えるために、これまで以上に長い文字列を配置する必要があるため、一種のハッキーです)

    -それは最初の子供、または...

    (f.foo_id in (select MIN(foo_id) from foo fc1 where fc1.foo_parent_id =f.foo_parent_id)
     )
     or
    

    --2番目の子、または...

    (f.foo_id in (select MIN(foo_id) from foo fc1 where fc1.foo_parent_id =f.foo_parent_id  and fc1.foo_id not in (select MIN(foo_id) from foo fc2 where fc2.foo_parent_id=f.foo_parent_id))
     )
     or 
    

    -それは親です

     f.foo_parent_id is null
    order by isnull(f.foo_parent_id,f.foo_id)*100 + f.foo_id
    

    したがって、ここで行っているのは、基本的に、parent_id列と、その下の子列を少しひねって並べ替えることです。親ID列がNULLの場合、実際のIDを使用します。これは、注文の目的で、テーブルが次のようになることを意味します:

    ==============================================================================
    | foo_id | foo_parent_id |   isnull(f.foo_parent_id,f.foo_id)
    ==============================================================================
    | 1      | NULL           |         (1)
    | 2      | NULL           |         (2)
    | 3      |  1             |         1
    | 4      |  2             |         2
    | 5      |  1             |         1
    | 7      |  2             |         2
    ----------------------------------------------------------------------
    

    次に、その注文列* 100

    を乗算します。
    ==============================================================================
    | foo_id | foo_parent_id |   isnull(f.foo_parent_id,f.foo_id)*100
    ==============================================================================
    | 1      | NULL           |         100
    | 2      | NULL           |         200
    | 3      |  1             |         100
    | 4      |  2             |         200
    | 5      |  1             |         100
    | 7      |  2             |         200
    ----------------------------------------------------------------------
    

    最後に、foo_id列を追加します

    ==============================================================================
    | foo_id | foo_parent_id |   isnull(f.foo_parent_id,f.foo_id)*100 + foo_id
    ==============================================================================
    | 1      | NULL           |         101
    | 2      | NULL           |         202
    | 3      |  1             |         103
    | 4      |  2             |         204
    | 5      |  1             |         105
    | 7      |  2             |         207
    ----------------------------------------------------------------------
    

    次に、その仮想列でテーブルを並べ替えます...

    ==============================================================================
    | foo_id | foo_parent_id |   ORDER BY isnull(f.foo_parent_id,f.foo_id)*100 + foo_id
    ==============================================================================
    | 1      | NULL           |         101
    | 3      |  1             |         103
    | 5      |  1             |         105
    | 2      | NULL           |         202    
    | 4      |  2             |         204
    | 7      |  2             |         207
    ----------------------------------------------------------------------
    

    どうぞ!



    1. コマンドラインを使用してMySQLテーブルの外部キーを変更する方法

    2. MySQLは、月ごとのグループを含む、他の2つの計算された合計のパーセンテージを計算します

    3. INSERT INTOでの#1064エラー

    4. 電話のSQLvarchar(length)で考慮すべき世界で最も長い電話番号は何ですか