2010-12-03 25 views
0

無限の量のサブグループを持つことができるアプリのグループ間の関係を純粋に保持するテーブルがあります。MySQLで一番上の再帰を再帰的に選択

CREATE TABLE `shop_groups_group_rel` (
    `id_group` int(11) NOT NULL, 
    `id_parent` int(11) NOT NULL, 
    `type` enum('shop','group') NOT NULL 
); 

「ショップ」のタイプは、基本的に一番上を意味します。

私が解析している可能性のあるグループに対して、一番上のグループを得ることができるようにする必要があります。私はMySQLのLOOP構文を見てきましたが、これをデータベース上の実際のクエリと混在させる方法。

私が一番上のグループになるまで、どのようにして再帰的に親グループを選択できるかについてのヒントは誰にでも伝えられますか?

これは、無限の量のサブグループが存在する可能性があるので危険であるかもしれませんが、実際には2〜3つのサブグループ以上になることはありません。

ありがとうございました

答えて

0

ハード制限がある場合は、ジョインだけでも問題ありません。

SELECT id_group, 
COALESCE(p4.id_group, p3.id_group, p2.id_group, p1.id_group, g.id_group) 
    as top_id_group 
FROM shop_groups_group_rel g 
LEFT JOIN shop_groups_group_rel p1 ON p1.id_group = g.id_parent 
LEFT JOIN shop_groups_group_rel p2 ON p2.id_group = p1.id_parent 
LEFT JOIN shop_groups_group_rel p3 ON p3.id_group = p2.id_parent 
LEFT JOIN shop_groups_group_rel p4 ON p4.id_group = p3.id_parent 

あなたは無期限に行くことができないので、それは明らかに、再帰的ではありませんが、あなたはできるだけ多くを追加することができ、あなたが合理的にあなたのデータセットに期待するとして加入。非常に高速ではありませんが、一番上の親に達すると基本的に残りの結合はスキップされます。

+0

ありがとうございました。実際に私ができることは、それを考慮していませんでした。私はまだループでこれを行うことが可能かどうかを知りたいです。しかし今のところあなたのソリューションはトリックを行い、決して3/4を超えるサブグループは存在しません。 – Naatan

+0

MySQLでは、(PostgreSQLやFirebirdとは異なり)再帰的クエリをサポートしていないので、ストアドプロシージャ内でのみ "ループ"を実行できます。 –