ご承知のとおりのオプションが含まれて、MySQLは、「アウト・オブ・ボックス」再帰を扱うことができません。
- がに隣接リストからの切り替えストアドプロシージャ
- を書きます代替モデル(例:同じ頻度(アプリケーションレベルのコードに再帰を処理
- 必要とすることができるようにそれ自体にテーブルを結合するネストされたセット)
- は、例えば、PHPのビット)ここ
オプション3を使用した例であるが、それオプション4に合わせて簡単に調整することができます...
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(
family_id INT NOT NULL,
item_id INT NOT NULL,
parent_id INT NULL,
PRIMARY KEY(family_id, item_id)
);
INSERT INTO my_table
VALUES (101, 1, null), (101, 2, 1), (101, 3, 2), (101, 4, 3),
(101, 5, 4), (101, 6, 5), (101, 7, 3), (101, 8, 7), (101, 9, 8);
SELECT CONCAT_WS(','
, a.item_id
, b.item_id
, c.item_id
, d.item_id
, e.item_id
, f.item_id
, g.item_id
, h.item_id
, i.item_id
) series
FROM
my_table a
LEFT JOIN
my_table b ON b.parent_id = a.item_id AND b.family_id = a.family_id
LEFT JOIN
my_table c ON c.parent_id = b.item_id AND c.family_id = b.family_id
LEFT JOIN
my_table d ON d.parent_id = c.item_id AND d.family_id = c.family_id
LEFT JOIN
my_table e ON e.parent_id = d.item_id AND e.family_id = d.family_id
LEFT JOIN
my_table f ON f.parent_id = e.item_id AND f.family_id = e.family_id
LEFT JOIN
my_table g ON g.parent_id = f.item_id AND g.family_id = f.family_id
LEFT JOIN
my_table h ON h.parent_id = g.item_id AND h.family_id = g.family_id
LEFT JOIN
my_table i ON i.parent_id = h.item_id AND i.family_id = h.family_id
WHERE
a.parent_id IS NULL;
+-------------+
| series |
+-------------+
| 1,2,3,4,5,6 |
| 1,2,3,7,8,9 |
+-------------+
2番目の問題は、最初のものを超える難易度です。 7,8がA系列かB系列かを知る方法はありません。(私はシリーズBの論理も理解していません) – Strawberry
2つの系列は3で分割されています。それは道路の分岐点のように考えてください。私はデータセットが与えられればそれは理にかなっていると思うが、私は単なる(あるいは多分)複数のMySQLコールを扱うのは不可能かもしれないことを認めている。私はPHPなどを取得する必要がありますこれに関わっている。 – HartleySan
実際の問題は、明らかに2番目の問題よりも複雑であるため、私たちが何を提供できるのかは分かりません。 – Strawberry