2009-05-01 16 views
29

में पंक्तियों को पुन: व्यवस्थित कैसे कर सकता हूं क्या SQL डेटाबेस में पंक्तियों को पुन: व्यवस्थित करना संभव है? उदाहरण के लिए; मैं दूसरी पंक्ति और तीसरी पंक्ति के मूल्यों का क्रम कैसे बदल सकता हूं?मैं एसक्यूएल डेटाबेस

पंक्ति के क्रम में मेरे लिए महत्वपूर्ण के बाद से मैं क्रम के अनुसार मूल्य प्रदर्शित करने के लिए की जरूरत है।


सभी उत्तरों के लिए धन्यवाद। लेकिन 'ऑर्डर बाय' मेरे लिए काम नहीं करेगा।

उदाहरण के लिए, मैंने डेटाबेस में बुकमार्क की एक सूची डाली। मैं क्वेरी से प्राप्त परिणाम के आधार पर प्रदर्शित करना चाहता हूं। (वर्णमाला क्रम में नहीं)। बस जब वे डाले जाते हैं।

लेकिन उपयोगकर्ता सकता है बुकमार्क की स्थिति (किसी भी तरह से वह/वह चाहता है में) फिर से व्यवस्थित। तो मैं 'ऑर्डर बाय' का उपयोग नहीं कर सकता।

एक उदाहरण है कि कैसे फ़ायरफ़ॉक्स में बुकमार्क में बुकमार्क प्रदर्शन। उपयोगकर्ता आसानी से स्थिति स्विच कर सकते हैं। मैं डीबी में इसका उल्लेख कैसे कर सकता हूं?

धन्यवाद। अपने SELECT क्वेरी में

उत्तर

10

उपयोग ORDER BY। उदाहरण के लिए, उपयोगकर्ता के अंतिम नाम से ऑर्डर करने के लिए, उपयोग करें:

SELECT * FROM User ORDER BY LastName 
4

वास्तविक डेटाबेस पर पंक्तियों का क्रम कोई फर्क नहीं पड़ता।

आप उन्हें ऑर्डर करने के लिए के रूप में आप की जरूरत है आपके प्रश्नों में ORDER BY खंड का उपयोग करना चाहिए।

1

मैं एक साधारण order by लगता होगा कि आप क्या ढूंढ रहे हैं?

select my_column from my_table order by my_order_column; 
1

जैसा कि अन्य ने एक आदेश का उपयोग किया है।
कभी भी भौतिक तालिका में मौजूद ऑर्डर डेटा पर निर्भर न करें, हमेशा उस डेटा का आधार बनाएं जिसके साथ आप काम कर रहे हैं, चाहे वह एक या अधिक महत्वपूर्ण फ़ील्ड हों।

3

डेटाबेस डेटा को किसी भी तरह से स्टोर कर सकते हैं। "ऑर्डर बाय" क्लॉज का उपयोग डेटा के ऑर्डर की गारंटी के लिए केवल तरीका है। आपके बुकमार्क उदाहरण में, आपके पास एक पूर्णांक फ़ील्ड हो सकता है जो ऑर्डरिंग को इंगित करता है, और फिर उस फ़ील्ड को अपडेट करता है क्योंकि उपयोगकर्ता चीजों को चारों ओर ले जाता है। फिर सही क्रम में चीजें प्राप्त करने के लिए उस कॉलम द्वारा ऑर्डर करें।

15

जैसा कि अन्य ने उल्लेख किया है, डेटाबेस तालिका के भौतिक क्रम पर निर्भर होना अच्छा नहीं है। रिलेशनल टेबल अवधारणात्मक रूप से आदेशित सूचियों की तुलना में अनियमित सेट की तरह अधिक हैं। एक निश्चित शारीरिक आदेश मानने से अप्रत्याशित परिणाम हो सकते हैं।

आपको जो चाहिए वह लगता है कि एक अलग कॉलम है जो उपयोगकर्ता के पसंदीदा सॉर्ट ऑर्डर को संग्रहीत करता है। लेकिन आपको उस क्रम में परिणामों को प्रदर्शित करने के लिए अभी भी अपनी क्वेरी में कुछ करने की आवश्यकता होगी।

क्लस्टर्ड इंडेक्स बनाकर डेटाबेस में रिकॉर्ड्स के भौतिक क्रम को निर्दिष्ट करना संभव है, लेकिन यह ऐसा कुछ नहीं है जिसे आप मनमाने ढंग से उपयोगकर्ता द्वारा निर्दिष्ट आधार पर करना चाहते हैं। और यह अभी भी अप्रत्याशित परिणाम हो सकता है।

0

your post here के जवाब में, इस सवाल का जवाब आप के लिए देख जा सकता है:

कालक्रम के अनुसार आदेश के लिए, एक datetime या smalldatetime डेटाप्रकार के साथ एक DateAdded या इसी तरह के स्तंभ जोड़ें।

डेटाबेस में डालने वाली सभी विधियों पर, सुनिश्चित करें कि आप CURRENT_TIMESTAMPDateAdded कॉलम में डालें।

तरीकों कि डेटाबेस क्वेरी पर, क्वेरी स्ट्रिंग के अंत में ORDER BY DateAdded जोड़ें।

कभी डेटाबेस प्रणाली में शारीरिक स्थिति पर निर्भर हैं। यह समय का सबसे अधिक काम करता है लेकिन निश्चित रूप से हर समय नहीं।

63

ऐसा लगता है कि आप की तरह "ListOrder" एक और स्तंभ की जरूरत है। तो अपनी मेज की तरह लग सकता है:

BookMark ListOrder 
======== ========= 
    d  1 
    g  2 
    b  3 
    f  4 
    a  5 

तो फिर तुम ListOrder "द्वारा आदेश" कर सकते हैं।

Select * from MyTable Order By ListOrder 

उपयोगकर्ता एक बार में केवल एक बुकमार्क एक ही स्थान पर स्थानांतरित कर सकते हैं, तो आप ListOrder के रूप में पूर्णांकों का उपयोग करें, और उन्हें स्वैप कर सकते हैं। उदाहरण के लिए, उपयोगकर्ता एक पंक्ति ऊपर "f" स्थानांतरित करने के लिए चाहता है:

Update MyTable 
    Set ListOrder=ListOrder+1 
     Where ListOrder=(Select ListOrder-1 From MyTable where BookMark='f') 

Update MyTable 
    Set ListOrder=ListOrder-1 
     Where BookMark='f' 

उपयोगकर्ता एक बार में एक बुकमार्क ऊपर या नीचे कई पंक्तियों स्थानांतरित कर सकते हैं, तो आप एक खंड को पुन: व्यवस्थित करने की जरूरत है।

update MyTable 
    Set ListOrder=ListOrder+1 
     where ListOrder>=1 -- The New position 
      and ListOrder <(Select ListOrder from MyTable where BookMark='f') 

update MyTable 
    Set ListOrder=1 -- The New Position 
     Where Bookmark='f' 
+0

इस विचार के लिए धन्यवाद। मुझे लगता है कि मैं यह देखने की कोशिश कर रहा था कि क्या मैं एक नया Coloumn बनाये बिना अपनी समस्या का समाधान कर सकता हूं। – lucius

+0

लेकिन क्या यह काम एक समय में एक स्थान से अधिक स्थानांतरित होने पर काम कर सकता है? उदाहरण के लिए, यदि उपयोगकर्ता "एफ" को 4 से 2 तक ले जाना चाहते हैं तो क्या होगा? सभी जी, बी, अद्यतन करने की आवश्यकता है। – lucius

+0

हां, यह ऊपर दिए गए कोड में मेरा दूसरा उदाहरण है। –

0

सबसे पहले, मुझे यहाँ हर किसी के साथ सहमत हैं कि तालिका में आदेश में कोई फर्क नहीं करना चाहिए: उदाहरण के लिए, उपयोगकर्ता सूची के शीर्ष पर "f" जाना चाहता है, तो आप की जरूरत है। एक अलग [SortOrder] कॉलम का उपयोग करें जिसे आप अपडेट करते हैं और ऑर्डर बाय ऑर्डर शामिल करते हैं।

उस ने कहा, SQL सर्वर डेटाबेस एक तालिका पर एक "क्लस्टर इंडेक्स" की अनुमति देता है जो वास्तव में अंतर्निहित तालिका भंडारण में स्थिति को मजबूर करेगा। मुख्य रूप से उपयोगी यदि आपके पास एक बड़ा डेटासेट है और हमेशा कुछ विशिष्ट द्वारा क्वेरी करता है।

0

सवाल पर कोई विस्तृत व्याख्या है कि किसी को आप सही उत्तर दे अभाव होता है। स्पष्ट रूप से आप रिकॉर्ड्स को मेमोरी में पढ़ सकते हैं और फिर उन्हें अपडेट कर सकते हैं। लेकिन यह कई अलग-अलग स्तरों पर बुरा है।

समस्या इस तरह है। वास्तव में लागू की गई स्कीमा के आधार पर रिकॉर्ड्स डिस्क पर शारीरिक रूप से लिखे गए तरीके से तर्क है। कभी-कभी वे सम्मिलित करने के क्रम में लिखे जाते हैं और अन्य बार उन्हें ब्लॉक के बीच स्थान के साथ डाला जाता है (एक्सेंट्स देखें)।

तो बदलते शारीरिक आदेश स्तंभ डेटा की अदला-बदली के बिना होने की संभावना नहीं है, और इसका विभिन्न सूचकांक पर गहरा असर पड़ता है। आपको लॉजिकल ऑर्डर बदलने के लिए छोड़ दिया गया है।

जैसा कि मैंने आपके अपडेट को पढ़ा है ... मुझे यह समझने के लिए छोड़ दिया गया है कि आपके पास एकाधिक उपयोगकर्ता हो सकते हैं और प्रत्येक उपयोगकर्ता को उन बुकमार्क होना चाहिए जिन्हें वे आदेश देना चाहते हैं। ऐसा लगता है कि आपको दूसरी तालिका की आवश्यकता है जो उपयोगकर्ता और बुकमार्क के बीच एक चौराहे के रूप में कार्य करता है। तब आपको केवल एक आंतरिक शामिल होना चाहिए और एक आदेश है।

लेकिन वहाँ एक पूर्ण समाधान की पेशकश करने के लिए पर्याप्त जानकारी नहीं है।

0

अपनी तालिका में position कॉलम जोड़ें और एक साधारण पूर्णांक के रूप में स्टोर करें।

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

  • बुकमार्क: id,url
  • उपयोगकर्ताओं: id,name
  • users_bookmarks: user_id, bookmark_id, position, date_created

मान लिया जाये कि date_created से भर जाता है जब पंक्तियों डालने आप माध्यमिक सूची तिथि के आधार पर आदेश प्राप्त कर सकते हैं।

select bookmark_id from users_bookmarks where user_id = 1 order by position, date_created; 
1

मेरे पास इसका समाधान है कि मैंने कुछ बार उपयोग किया है। मैं तालिका में एक अतिरिक्त फ़ील्ड "sort_order" रखता हूं, और इसे पुन: व्यवस्थित करते समय अद्यतन करता हूं। मैंने मामलों में इसका उपयोग किया है जब मेरे पास वस्तुओं के साथ कुछ प्रकार के कंटेनर हैं, और आइटम का क्रम कंटेनर के अंदर संपादन योग्य होना चाहिए। जब पुन: व्यवस्थित होता है, तो मैं केवल वर्तमान कंटेनर में आइटम्स के लिए sort_order अद्यतन करता हूं, जिसका अर्थ है कि कई (आमतौर पर अभ्यास में केवल कुछ ही) पंक्तियों को अद्यतन करना होता है।

संक्षेप में, मैं निम्नलिखित है:

  1. आइटम तालिका
  2. जब एक नई पंक्ति सम्मिलित करने, मैं SORT_ORDER स्थापित करने के लिए एक SORT_ORDER फ़ील्ड जोड़ = आईडी
  3. जब पुन: क्रम (आइटम के आईडी की जरूरत है द्वारा SORT_ORDER
  4. दो सरणी में पंक्तियों से आईडी और SORT_ORDER विभाजित
    • चयन आईडी, SORT_ORDER मदों से जहां कंटेनर = आईडी आदेश: स्थानांतरित करने के लिए, और आइटम के आईडी के बाद सम्मिलित करने के लिए) रों
    • आइटम की आईडी को दूर आईडी-सूची
    • से स्थानांतरित करने के लिए सम्मिलित करने के लिए आइटम की आईडी के बाद स्थानांतरित करने के लिए
    • के बाद id की सूची और SORT_ORDER की सूची विलय मद की आईडी डालें मर्ज किए गए सूची के साथ एक दो आयामी सरणी, के रूप में [[id, sort_order], [id2, sort_order], ...]
    • रन update item set sort_order=SORT_ORDER where id=ID (executemany) में

(अगर एक और कंटेनर के लिए आइटम चलती, अद्यतन करने के बाद "कंटेनर विदेशी कुंजी" पहला या अंतिम पर निर्भर करता है के लिए कदम एप्लिकेशन।)

(अद्यतन आइटम की एक बड़ी संख्या शामिल है, मुझे नहीं लगता कि इस समाधान एक अच्छा दृष्टिकोण है।)

मैं http://wannapy.blogspot.com/2010/11/reorder-rows-in-sql-database.html (कॉपी पर एक उदाहरण अजगर और mysql का उपयोग किया जाता है और यह कोशिश की है) कुछ अतिरिक्त स्पष्टीकरण के साथ।

-3

आप अपने विशिष्ट आवश्यकताओं के अनुसार तालिका में रिकॉर्ड की व्यवस्था करना चाहते हैं और जब आप न तालिका में रिकॉर्ड के लिए आदेश क्षेत्र है, तो आप निम्नलिखित विकल्प का प्रयास कर सकते हैं: का उपयोग कर

  1. ओपन आप डेटाबेस स्कीमा/डेटाबेस टॉड संपादक
  2. टोड निर्यात विकल्प
  3. का उपयोग कर एक्सेल प्रारूप में इच्छित वांछित तालिका निर्यात करें निर्यात किए गए एक्सेल में आप जो भी परिवर्तन करना चाहते हैं। एक्सेल में पंक्तियों को पुन: व्यवस्थित करना काफी आसान है।
  4. एक्सेल सहेजें और टोड आयात विकल्प का उपयोग करके इसे तालिका में वापस आयात करें।

प्राप्त मेंढक: http://www.quest.com/toad-for-mysql/

+0

यह उपयोगकर्ता कार्यों के लिए बेकार है और एक अच्छा विचार नहीं है (हर दूसरे उत्तर को बहुत अधिक देखें) –

-1

आप एक अंकीय कॉलम (पंक्ति आईडी, लेनदेन आईडी, आदि) है, तो और यह है कि क्या आपको लगता है कि स्तंभ प्राथमिक कुंजी बनाने छंटाई का समाधान हो जाएगा हल हो की उम्मीद कर रहे हैं, अद्यतन विवरण चलाने या तालिका पूछने के बिना समस्या के बिना समस्या।

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