5

以下のようなフィールドを持つ MySQL テーブルがあります。

id            name             parent
1             Fruit             0
2             Meat              0
3             Orange            1
4             Beef              2

ここで、parent フィールドは上位レベル ID を意味します。たとえば、フルーツ ID は 1 で、オレンジはフルーツの 1 つなので、親は 1 です。

ただし、親->子->親->子の形式ですべてのレコードを取得する効率的なMySQLクエリを実行したいと考えています。どうやってやるの?

クエリの結果レコードは次のようになります。

id            name             parent
1             Fruit             0
3             Orange            1
2             Meat              0
4             Beef              2
4

4 に答える 4

11

mysql がサポートしていない再帰結合が必要です。あなたができる唯一のことは、深さの最大レベルを決定することです(私はあなたがp-> cを持っているので、あなたの場合は1です)そしてこれで必要な結合の数を決定することができます:

深さの最大レベル = 自己結合の数:

SELECT
    p.id as parent_id,
    p.name as parent_id,
    c1.id as child_id,
    c1.name as child_name
FROM 
    my_table p
LEFT JOIN my_table c1
    ON c1.parent = p.id
WHERE
    p.parent=0

たとえば、深さの最大レベルが 3 の場合、3 つの自己結合が必要になります。

SELECT
    p.id as parent_id,
    p.name as parent_id,
    c1.id as child_id_1,
    c1.name as child_name_1,
    c2.id as child_id_2,
    c2.name as child_name_2,
    c3.id as child_id_3,
    c3.name as child_name_3
FROM 
    my_table p
LEFT JOIN my_table c1
    ON c1.parent = p.id
LEFT JOIN my_table c2
    ON c2.parent = c1.id
LEFT JOIN my_table c3
    ON c3.parent = c2.id
WHERE
    p.parent=0
于 2013-05-29T08:30:45.737 に答える
3

これはどう?

select * from foods
order by (case parent when 0 then id*1000 else parent*1000+id end), id

同じ親を持つ食品が 1000 個を超える場合は機能しないため、あまり良くありませんが、その制限を知っていればうまくいくはずです。

于 2013-05-29T08:31:55.567 に答える
1

探している結果を得るための別のオプションを次に示します。親の ID で親と子をグループ化し、どのレコードが親 (isparent) であるかを示すことができます...次のように: (この例では、親レコードの親の値が 0 ではなく NULL であると仮定しています。..ただし、0でも機能します)

SELECT
    IFNULL(parent,id) AS parentid,
    IF(parent IS NULL,1,0) AS isparent,
    name
FROM my_table
ORDER BY
    parentid ASC, <- groups/orders all parentid's together
    isparent DESC, <- orders the parent first
    id DESC <- orders children by their id next

残りは、出力をグループ化するなど、簡単に把握できるはずです。

于 2016-04-27T15:08:12.307 に答える
-1

以下のクエリをUNION次のように使用できます。

SELECT ID, NAME, PARENT
FROM MY_TABLE AS A,
     MY_TABLE AS B
WHERE A.PARENT != 0 AND
      A.PARENT = B.ID
UNION
SELECT ID, NAME, PARENT
FROM MY_TABLE
WHERE PARENT == 0
于 2016-03-29T09:02:15.893 に答える