2011-11-05 7 views
10

मैं अपनी SQL Server 2008 क्वेरी को इस तरह से लिखने की कोशिश कर रहा हूं कि मैं आवश्यकतानुसार अपने आउटपुट और आउटपुट हेडर के माध्यम से लूप कर सकता हूं। मैंने इस सामान को कई बार गलत तरीके से किया है और पृष्ठ के भीतर कोल्डफ्यूज़न कड़ी मेहनत कर रहा है, लेकिन SQL सर्वर में ऐसा करने की आवश्यकता है।मैं माता-पिता के बाद बच्चे को कैसे आदेश दूं?

FeatureID ParentID Feature 
-------------------------- 
1   0  Apple  
2   0  Boy 
3   2  Charles 
4   1  Daddy 
5   2  Envelope 
6   1  Frankfurter 

मैं इस तरह देखने के लिए अपनी क्वेरी resultset हैं:

FeatureID ParentID Feature 
-------------------------- 
1   0  Apple  
4   1  Daddy 
6   1  Frankfurter 
2   0  Boy 
3   2  Charles 
5   2  Envelope 

तो ParentID 0 है, इसका मतलब है कि यह एक बड़ा वर्ग है। यदि माता-पिता 0 से अधिक है, तो इसका मतलब है कि यह एक मामूली श्रेणी है, जो माता-पिता का बच्चा है।

इसलिए माता-पिता को ए-जेड का आदेश देने की आवश्यकता है और बच्चों को ए-जेड का आदेश दिया जाना चाहिए।

क्या आप मुझे यह आदेश सही तरीके से प्राप्त करने में मदद कर सकते हैं?

SELECT FeatureID, ParentID, Feature 
FROM Features 
ORDER BY 
+0

द्वारा बच्चों तो क्यों ParentID 0 के साथ लड़का ParentID 1 के साथ फ्रैंकफर्टर नीचे सॉर्ट हो जाता है? – Andomar

+0

क्योंकि मैं माता-पिता और फिर उसके बच्चों और फिर अगले माता-पिता और उसके बाद के बच्चों को आउटपुट करना चाहता हूं। –

+1

इस बहुत आसान तरीके से प्रयास करें: http://stackoverflow.com/questions/13382380/mysql-order-by-parent-and-child – Otak

उत्तर

9

अपनी टिप्पणी से (हालत अपने बच्चे की ParentID अपने ParentID के FeatureID है के साथ), यदि आप जानते हैं केवल दो स्तर हैं, वहाँ एक आसान है समाधान:

select * 
from @Features feat 
order by 
     case 
     when ParentID = 0 
     then Feature 
     else (
       select Feature 
       from @Features parent 
       where parent.FeatureID = feat.ParentID 
       ) 
     end 
,  case when ParentID = 0 then 1 end desc 
,  Feature 
  1. मूल तत्व के नाम से क्रमबद्ध करें: जड़ के लिए, इस सुविधा स्तंभ है। बच्चों के लिए, एक सबक्वायरी के साथ रूट का नाम देखें।
  2. क्रमबद्ध पर शीर्ष
  3. क्रमबद्ध रूट नाम

Example at SE Data.

+0

जीपर्स !!! ऐसा कुछ ऐसा कोड है जो ऐसा लगता है जैसे यह बहुत अधिक सरल होना चाहिए। आपका उदाहरण ठीक काम करता प्रतीत होता है। यह एक अलग तरीके से करने से ज्यादा बोझिल है। –

+0

हाँ, उत्पादन कोड के लिए जटिल तरीका। मैं उम्मीद कर रहा था कि कोई और आसान समाधान पोस्ट करेगा। ध्यान दें कि यदि आप एक निश्चित गहराई तक सीमित थे, तो आप कोड को बहुत सरल बना सकते हैं, कहें कि रूट और पत्ता – Andomar

+0

के बीच अधिकतम 2 नोड्स वास्तव में, केवल दो स्तर, माता-पिता और बच्चे होंगे। वे दादा या पोते नहीं होंगे। –

6

mysql के लिए, आप की कोशिश कर सकते हैं:

SELECT FeatureID, ParentID, Feature 
FROM Features 
ORDER BY case when ParentID=0 then FeatureID else ParentID end * 1000 + FeatureID ASC 
+0

+1 यह तब तक अच्छी तरह से काम करता है जब तक कि तालिका अल्फाबेटिकल ऑर्डर में न हो, और आपके पास 999 से अधिक पंक्तियां नहीं हैं – Andomar

+1

क्या यह केवल केस द्वारा ऑर्डर नहीं किया जाना चाहिए जब माता-पिता = 0 तब फ़ीचर आईडी ईएलएसई माता-पिता अंत ASC, फ़ीचरआईडी एएससी इसके बजाए? क्योंकि तब भी यह इंडेक्स का उपयोग करेगा और यह 999 रिकॉर्ड तक ही सीमित नहीं होगा। लेकिन हाँ यह विफल हो जाता है यदि आपके पास '(7, 8, 'बार')' और '(8, 0, 'foo')', ('फ़ील्ड आईडी <1) फ़ीचर आईडी Seph

संबंधित मुद्दे