Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

जटिल एसक्यूएल आदेश

मुझे लगता है कि लेखों के लिए "उत्तर आईडी" 0 है और टिप्पणियों के लिए आलेख संख्या है। अगर यह आपका डिज़ाइन है, तो यह काम करेगा:

select * from yourTable
order by
  case when "reply id" = 0 then id else "reply id" end, id

जोड़ा गया: आपकी टिप्पणी में अतिरिक्त जानकारी के लिए धन्यवाद। परिणामों को अपने इच्छित क्रम में रखना इतना आसान नहीं है, क्योंकि पहली ऑर्डरिंग कुंजी थ्रेड-स्टार्टर पोस्ट की create_date है। यह डेटा पंक्ति में नहीं है, इसलिए आपको शामिल होने की आवश्यकता है। यहाँ अतिरिक्त जानकारी के आधार पर मेरा सबसे अच्छा अनुमान है (जो अभी भी मुझे अनुमान लगाने से रोकने के लिए पर्याप्त नहीं है):

select
  f.id, f.user_id, f.type, f.reply_id, f.text, f.url, f.created_date,
  coalesce(parentfeed.created_date,f.created_date) as thread_date
from feed as f left outer join feed as parentfeed
on f.reply_id = parentfeed.id
order by
  thread_date desc,
  case when f.reply_id = 0 then 0 else 1 end,
  created_date desc, id;

पोस्टग्रे के लिए आपको सिंटैक्स समायोजित करने की आवश्यकता हो सकती है। मैंने SQL सर्वर में इसका परीक्षण किया।

यदि यह अभी भी वह नहीं करता है जो आप चाहते हैं, तो कृपया इस बारे में विशिष्ट रहें कि आप डेटा को कैसे वापस चाहते हैं। अधिमानतः, मुझे "आईडी" ऑर्डर बताएं जो मुझे आपकी डंप फ़ाइल में डेटा के लिए देखना चाहिए, और भी उस आदेश का आधार स्पष्ट करें। यहाँ मैंने क्या किया:

  1. एक थ्रेड के सभी संदेश (थ्रेड =एक संदेश और उसकी टिप्पणियाँ) एक साथ समूहीकृत किए जाने चाहिए।

  2. एक धागे के भीतर, संदेश को शीर्ष पर रखें, उसके बाद उसकी टिप्पणियों को विपरीत कालानुक्रमिक क्रम में रखें। सबसे हाल ही में बनाई गई/_date वाली थ्रेड पहले होनी चाहिए, फिर दूसरी सबसे हाल ही में बनाई गई_डेट वाली थ्रेड, इत्यादि। (आपके नमूना डेटा में एक ही create_date के साथ कई टिप्पणियां थीं, इसलिए मैंने थ्रेड के भीतर टिप्पणियों के लिए द्वितीयक क्रम कुंजी के रूप में "id" का उपयोग किया।)

नोट: आपका डंप इंगित करता है कि यदि किसी पोस्ट को संशोधित किया जाता है तो create_date को CURRENT_TIMESTAMP में अपडेट कर दिया जाता है। यदि यह एक लाइव संदेश बोर्ड है, तो सावधान रहें कि इससे टिप्पणियां पहले . की हो सकती हैं मूल संदेश, और इसका मतलब है कि एक धागा शीर्ष पर रहेगा यदि इसे अक्सर संशोधित किया जाता है (यहां तक ​​​​कि इसके पाठ में कोई वास्तविक परिवर्तन नहीं होने के बावजूद)। (यह मेरे समाधान के लिए प्रासंगिक नहीं है, लेकिन मुझे लगा कि यह ध्यान देने योग्य है।)

चूंकि जुड़ने की आवश्यकता है, इसलिए यह क्वेरी अब बहुत धीमी हो जाएगी। मेरा सुझाव:दो दिनांक कॉलम, "thread_last_modified" और "item_last_modified" बनाए रखें। आपको थ्रेड-स्टार्टर से लेकर टिप्पणियों तक अपडेट को कैस्केड करना होगा, लेकिन मुझे लगता है कि अगर बहुत सारे अपडेट नहीं हैं तो यह इसके लायक है, क्योंकि क्वेरी बहुत आसान हो सकती है। मैंने इसका परीक्षण नहीं किया है क्योंकि इसके लिए आपके डिज़ाइन में कई बदलावों की आवश्यकता है:

select
  id, user_id, type, reply_id, text, url, thread_last_modified, item_last_modified
from feed
order by
  thread_last_modified desc,
  case when f.reply_id = 0 then 0 else 1 end,
  item_last_modified desc, id;

#2 जोड़ा गया :यदि आप केवल थ्रेड चाहते हैं जिसमें id ::thisOne के साथ टिप्पणी है, तो मुझे लगता है कि आप इस लाइन को ON और ORDER BY क्लॉज (मेरे पहले जोड़े गए समाधान के लिए, शामिल होने के लिए) के बीच जोड़ सकते हैं:

where parentfeed.id = (
  select coalesce(reply_id,id)
  from feed
  where id = ::thisOne
)

सिद्धांत रूप में, इस लुकअप का मूल्यांकन केवल एक बार क्वेरी के लिए किया जाना चाहिए, लेकिन यदि यह व्यवहार में नहीं है, तो आप इसे ::thisOneThreadID के रूप में पूर्व-गणना कर सकते हैं और जोड़ सकते हैं

where parentfeed.id = ::thisOneThreadID

दूसरे समाधान के लिए, यह मानकर कि आप पुन:गणना करते हैं, प्रयास करें

where coalesce(id,reply_id) = ::thisOneThreadID

वैसे, मुझे संदेह है कि मेरे दोनों समाधान उन थ्रेड्स को मर्ज कर देंगे जिन्हें अंतिम बार एक ही समय में संशोधित किया गया था...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. लॉगस्टैश इनपुट MySQL

  2. डेटाबेस के लिए पहुँच अक्षम करें

  3. NodeJS mySQL ब्लॉब डालें

  4. MySQL त्रुटि:2013, 'प्रारंभिक संचार पैकेट पढ़ने' पर MySQL सर्वर से कनेक्शन खो गया, सिस्टम त्रुटि:0

  5. विदेशी कुंजी तभी छोड़ें जब वह मौजूद हो