SELECT
'accounts'.'id' AS id_0,
'accounts'.'child_id' AS child_id_0,
'child_accounts_1'.'id' AS id_1,
'child_accounts_1'.'child_id' AS child_id_1,
'child_accounts_2'.'id' AS id_2,
'child_accounts_2'.'child_id' AS child_id_2,
'child_accounts_3'.'id' AS id_3,
'child_accounts_3'.'child_id' AS child_id_3,
'child_accounts_4'.'id' AS id_4,
'child_accounts_4'.'child_id' AS child_id_4
FROM
'accounts'
LEFT OUTER JOIN 'accounts' 'child_accounts_1'
ON 'child_accounts_1'.'id' = 'accounts'.'child_id'
LEFT OUTER JOIN 'accounts' 'child_accounts_2'
ON 'child_accounts_2'.'id' = 'child_accounts_1'.'child_id'
LEFT OUTER JOIN 'accounts' 'child_accounts_3'
ON 'child_accounts_3'.'id' = 'child_accounts_2'.'child_id'
LEFT OUTER JOIN 'accounts' 'child_accounts_4'
ON 'child_accounts_4'.'id' = 'child_accounts_3'.'child_id'
WHERE 'accounts'.'id' = 56
これは、私のものが子の階層であることを除いて、あなたがしていることと非常に似ています。
accounts
テーブルには、それ自体を参照する属性がnegative_overflow_account_id
あります。これにより、ネストの最初の5つのレイヤーの「id」と「negative_overflow_id」が取得されます。
コードに、定数MAX_OVERFLOWに基づいてこのクエリを生成するループを記述しました。このループは、「5」に設定するとこれを生成し、別の数値を使用すると多かれ少なかれ実行されます。
基本的に、私の使用例は、誰かが無限に循環するループを設定していないことを確認することでした。そのため、レベル5に達すると、ユーザーにエラーが発生し、それほど深く設定できないことを通知します。また、いずれかのレベルが最上位レベルまたは前のレベルの1つを参照している場合は、循環再帰を示すエラーも生成されます(永続化が許可されている場合、後でアプリがクラッシュします)。
編集:私は名前を短くしました。誰もそのばかげたテーブルのための私の愚かなばかげた命名規則を見たくありません;)