दिलचस्प पोस्ट
दृश्य बेस 6 को मेरी आवरण बदलने से रोकें अंतिम आइटम को पायथन इटरेटर से प्राप्त करने का सबसे सुरक्षित तरीका std :: vector और बहुआयामी arrays की लगातार स्मृति IOS में फ़ाइल डाउनलोड और खोलना वर्ग और इंस्टेंस चर के बीच अंतर क्या है? कंसोल अनुप्रयोग में ELMAH का उपयोग करना CSS और JQUERY के साथ एक स्लाइड शो के माध्यम से एकाधिक पृष्ठभूमि छवियों को बनाने की कोशिश कर रहा है XPath: पाठ नोड का चयन करें एपीसी कैश प्रविष्टियों को कैसे साफ़ करें? अजीब परिणाम उत्पन्न करने वाली दोहरी गणना क्या "इस के लिए rvalue संदर्भ" है? क्या है और मुझे इसका उपयोग कब करना चाहिए? क्या Google API पर "नवीनतम" jQuery लाइब्रेरी पर कोई लिंक है? कब सी में एक वैश्विक चर का उपयोग करना ठीक है? एंड्रॉइड इम्यूलेटर पर गूगल मैप आवेदन चलाना

एक एसक्यूएल इन () खंड में मानों के क्रम से आदेश

मैं सोच रहा हूं कि इन () खंड में मूल्यों के क्रम से क्रम में (शायद एक बेहतर तरीका) दूर है।

समस्या यह है कि मेरे पास 2 प्रश्न हैं, एक है जो सभी आईडी और दूसरा जो सभी जानकारी प्राप्त करता है। पहले आईडी के क्रम को बनाता है, जिसे मैं दूसरा क्रम चाहता हूं। आईडी को IN () खंड में सही क्रम में रखा जाता है

तो ऐसा कुछ होगा (अत्यंत सरलीकृत):

SELECT id FROM table1 WHERE ... ORDER BY display_order, name SELECT name, description, ... WHERE id IN ([id's from first]) 

मुद्दा यह है कि दूसरी क्वेरी परिणामों को एक ही क्रम में नहीं लौटाती है जो आईडी को इन () खंड में डाल दिया जाता है

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

क्या कोई बेहतर विकल्प है?

नोट: जैसा कि पहली क्वेरी "उपयोगकर्ता द्वारा" चलती है और दूसरा पृष्ठभूमि प्रक्रिया में चलाया जाता है, उप प्रश्नों का उपयोग करते हुए 2 से 1 क्वेरी को संयोजित करने का कोई तरीका नहीं है।

मैं माईएसक्यूएल का उपयोग कर रहा हूं, लेकिन मैं सोच रहा हूं कि यह उपयोगी हो सकता है कि यह नोट किया कि अन्य डीबी के लिए कौन से विकल्प मौजूद हैं

वेब के समाधान से एकत्रित समाधान "एक एसक्यूएल इन () खंड में मानों के क्रम से आदेश"

MySQL के FIELD() फ़ंक्शन का उपयोग करें:

 SELECT name, description, ... FROM ... WHERE id IN([ids, any order]) ORDER BY FIELD(id, [ids in order]) 

FIELD() पहले पैरामीटर का सूचकांक वापस लौटाएगा जो पहले पैरामीटर (पहले पैरामीटर के अलावा अन्य) के बराबर है।

FIELD('a', 'a', 'b', 'c')

1 लौट आएगा

FIELD('a', 'c', 'b', 'a')

वापस आ जाएगी 3

यदि आप आईडी IN() खंड और FIELD() फ़ंक्शन को एक ही क्रम में पेस्ट करते हैं, तो यह वास्तव में आप क्या कर लेगा।

सॉर्ट किए गए डेटा को कैसे प्राप्त करें यह देखें।

 SELECT ... FROM ... WHERE zip IN (91709,92886,92807,...,91356) AND user.status=1 ORDER BY provider.package_id DESC , FIELD(zip,91709,92886,92807,...,91356) LIMIT 10 

दो हल करने के लिए वसंत कि समाधान:

  1. order by case id when 123 then 1 when 456 then 2 else null end asc

  2. order by instr(','||id||',',',123,456,') asc

( instr() ओरेकल से है, शायद आप locate() या charindex() या ऐसा कुछ पता है

इन खंड में मूल्यों का एक सेट है, और सेटों का क्रम नहीं है।

शामिल होने के साथ आपका समाधान और फिर display_order कॉलम पर ऑर्डर करना सबसे लगभग सही समाधान है; कुछ और संभवतः एक डीबीएमएस-विशिष्ट हैक है (या मानक एसक्यूएल में ओएलएपी फ़ंक्शंस के साथ कुछ सामान कर रहा है)। निश्चित रूप से, शामिल सबसे ज्यादा पोर्टेबल समाधान है (हालांकि display_order मानों के साथ डेटा जनरेट करना समस्याग्रस्त हो सकता है)। ध्यान दें कि आपको ऑर्डरिंग कॉलम चुनना पड़ सकता है; जो मानक एसक्यूएल में एक आवश्यकता थी, हालांकि मेरा मानना ​​है कि यह कुछ समय पहले एक नियम के रूप में सुगम रहा था (शायद एसक्यूएल -9 के रूप में लंबे समय पहले)।

सॉर्ट किए गए डेटा प्राप्त करने के लिए उत्तर

 SELECT ... FROM ... ORDER BY FIELD(user_id,5,3,2,...,50) LIMIT 10 

ओरेकल के लिए, जॉन का समाधान instr () फ़ंक्शन का उपयोग करता है यहाँ थोड़ा अलग समाधान है जो काम किया है – SELECT id FROM table1 WHERE id IN (1, 20, 45, 60) ORDER BY instr('1, 20, 45, 60', id)

 SELECT ORDER_NO, DELIVERY_ADDRESS from IFSAPP.PURCHASE_ORDER_TAB where ORDER_NO in ('52000077','52000079','52000167','52000297','52000204','52000409','52000126') ORDER BY instr('52000077,52000079,52000167,52000297,52000204,52000409,52000126',ORDER_NO) 

वास्तव में महान काम किया

MySQL FIND_IN_SET फ़ंक्शन का उपयोग करें:

  SELECT * FROM table_name WHERE id IN (..,..,..,..) ORDER BY FIND_IN_SET (coloumn_name, .., .., ..); 

यदि आप एमएस एसक्यूएल सर्वर 2008+ में क्वेरी द्वारा इनपुट किए गए मानों का उपयोग करते हुए एक क्वेरी पर मनमाने ढंग से सॉर्टिंग करना चाहते हैं, तो यह मक्खी पर एक तालिका बनाकर ऐसा किया जा सकता है (ओपी से नामकरण के उपयोग से)।

 SELECT table1.name, table1.description ... FROM (VALUES (id1,1), (id2,2), (id3,3) ...) AS orderTbl(orderKey, orderIdx) LEFT JOIN table1 ON orderTbl.orderKey=table1.id ORDER BY orderTbl.orderIdx 

यदि आप VALUES कथन को कुछ और के साथ बदलते हैं जो एक ही काम करता है, लेकिन एएनएसआई एसक्यूएल में है, तो यह किसी SQL डेटाबेस पर काम करना चाहिए।

नोट: रिकॉर्ड किए गए तालिका में 100 या उससे अधिक का सेट करते समय निर्मित तालिका में दूसरा कॉलम (orderTbl.orderIdx) आवश्यक है। मूल रूप से मेरे पास एक ऑर्डर आयडीएक्स कॉलम नहीं था, लेकिन मुझे लगता है कि परिणामस्वरूप 100 से बड़ा सेट होता है, मुझे स्पष्ट रूप से उस कॉलम के अनुसार सॉर्ट करना होता था; एसक्यूएल सर्वर एक्सप्रेस 2014 में वैसे भी

मेरा पहला विचार एक एकल प्रश्न लिखना था, लेकिन आपने कहा था कि यह संभव नहीं था क्योंकि एक उपयोगकर्ता द्वारा चलाया जाता है और दूसरा पृष्ठभूमि में चल रहा है उपयोगकर्ता से पृष्ठभूमि प्रक्रिया में जाने के लिए आप आईडी की सूची कैसे संग्रहीत कर रहे हैं? क्यों नहीं उन्हें एक अस्थायी तालिका में आदेश को इंगित करने के लिए एक कॉलम के साथ रखें।

तो इसके बारे में कैसे:

  1. उपयोगकर्ता इंटरफ़ेस बिट रन बनाता है और आपके द्वारा बनाए जाने वाली एक नई तालिका में मूल्यों को सम्मिलित करता है। यह आईडी, स्थिति और कुछ प्रकार की नौकरी संख्या पहचानकर्ता सम्मिलित करेगा)
  2. नौकरी संख्या पृष्ठभूमि प्रक्रिया को पारित कर दी जाती है (सभी आईडी के बजाय)
  3. पृष्ठभूमि प्रक्रिया चरण 1 में तालिका से एक चयन करती है और आप अन्य सूचनाएं प्राप्त करने के लिए जुड़ जाते हैं जिनकी आपको आवश्यकता होती है। यह स्थिति का स्तंभ WHERE खंड में आदेश संख्या और आदेशों का उपयोग करता है।
  4. पृष्ठभूमि प्रक्रिया, जब समाप्त हो जाती है, नौकरी पहचानकर्ता के आधार पर तालिका से हटाता है।

मुझे लगता है कि आपको अपने डेटा को इस तरह से संगठित करने का प्रबंधन करना चाहिए कि आप बस एक शामिल हो जाएंगे और यह सही होगा, इसलिए कोई हैक्स और जटिल चीजें नहीं चल रही हैं।

उदाहरण के लिए, मुझे ट्रैक पर लिखे गए "हाल ही में खेला" लिखे गए सूची में, SQLite पर बस ऐसा करता हूं:

 SELECT * FROM recently NATURAL JOIN tracks; 

इसे एक शॉट दें:

 SELECT name, description, ... WHERE id IN (SELECT id FROM table1 WHERE...) ORDER BY (SELECT display_order FROM table1 WHERE...), (SELECT name FROM table1 WHERE...) 

WHEREs सहसंबंधित subqueries ठीक से काम करने के लिए शायद थोड़ा tweaking ले जाएगा, लेकिन बुनियादी सिद्धांत ध्वनि होना चाहिए।

मैंने ऐसा करने की कोशिश की है एमएस एसक्यूएल सर्वर जहां हमारे पास फ़ील्ड () नहीं है:

 SELECT table1.id ... INNER JOIN (VALUES (10,1),(3,2),(4,3),(5,4),(7,5),(8,6),(9,7),(2,8),(6,9),(5,10) ) AS X(id,sortorder) ON X.id = table1.id ORDER BY X.sortorder 

ध्यान दें कि मैं दोहराव की अनुमति भी दे रहा हूं I