यहाँ एक विचार है। लेकिन यह आपके डेटा के सेटअप के तरीके के बारे में बहुत सी धारणाओं पर आधारित है। पेड़ के नीचे लगातार बढ़ती हुई आईडी, केवल दो स्तर, आदि।
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
(यह हिस्सा एक तरह से हैकी है, क्योंकि आपको पिछले दो बच्चों को पाने के लिए इनमें से एक लंबी स्ट्रिंग डालनी होगी)
--यह पहला बच्चा है, या...
(f.foo_id in (select MIN(foo_id) from foo fc1 where fc1.foo_parent_id =f.foo_parent_id)
)
or
--यह दूसरा बच्चा है, या...
(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 कॉलम द्वारा ऑर्डर कर रहा है और फिर उसके नीचे के बाल कॉलम थोड़े मोड़ के साथ हैं। यदि पैरेंटिड कॉलम NULL है तो हम वास्तविक आईडी का उपयोग करते हैं। इसका मतलब है कि ऑर्डर देने के लिए हमारी टेबल इस तरह दिखती है:
==============================================================================
| 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
----------------------------------------------------------------------
वहाँ हम जाते हैं!