रिकार्ड के लिए
SELECT * FROM mytable WHERE id IN (1,2,3,4) ORDER BY FIELD(id,3,2,1,4);
क्योंकि आप में सूची के आदेश की जरूरत नहीं है के रूप में अच्छी तरह से काम करना चाहिए WHERE
खंड
यह कैसे काम करता है,
आप सभी प्रकार के फैंसी ऑर्डर बना सकते हैं
उदाहरण के लिए, IF () फ़ंक्शन का उपयोग करना
SELECT * FROM mytable
WHERE id IN (1,2,3,4)
ORDER BY IF(FIELD(id,3,2,1,4)=0,1,0),FIELD(id,3,2,1,4);
इससे पहले 4 आईडी सूची में सबसे ऊपर दिखाई देंगे, अन्यथा, यह सबसे नीचे दिखाई देता है। क्यूं कर?
में ORDER BY
, आप या तो 0 या 1 मिलता है।
- यदि पहला कॉलम 0 है, तो पहले 4 आईडी में से कोई भी एक बनाएं
- यदि पहला कॉलम 1 है, तो इसे बाद में प्रदर्शित करें
इसे पहले कॉलम में DESC के साथ फ्लिप करें
SELECT * FROM mytable
WHERE id IN (1,2,3,4)
ORDER BY IF(FIELD(id,3,2,1,4)=0,1,0) DESC,FIELD(id,3,2,1,4);
में ORDER BY
, आप अभी भी 0 या 1 प्राप्त करते हैं।
- यदि पहला कॉलम 1 है, तो कुछ भी बनाओ लेकिन पहले 4 आईडी दिखाई देते हैं।
- यदि पहला कॉलम 0 है, तो मूल क्रम में पहले 4 आईडी बनाएं
आपका वास्तविक प्रश्न
यदि आप गंभीरता से इस पर इंटर्नल्स चाहते हैं, तो बुक के 189 और 192 के गोटो पेज
एक वास्तविक गहरे गोता के लिए।
संक्षेप में, वहाँ एक C ++ वर्ग कहा जाता है ORDER *order
( ORDER BY
अभिव्यक्ति ट्री)। में JOIN::prepare
, *order
नामक फ़ंक्शन में उपयोग किया जाता है setup_order()
। कक्षा के बीच में क्यों JOIN
? हर क्वेरी, यहां तक कि एक एकल तालिका के खिलाफ एक क्वेरी हमेशा एक JOIN के रूप में संसाधित होती है (मेरी पोस्ट देखें क्या JOIN स्थिति और WHERE की स्थिति के बीच निष्पादन अंतर है? )
इन सबके लिए सोर्स कोड है sql/sql_select.cc
जाहिर है, ORDER BY
पेड़ का मूल्यांकन करने जा रहा है FIELD(id,3,2,1,4)
। इस प्रकार, संख्या 0,1,2,3,4 वे मान हैं जिन्हें शामिल की गई पंक्ति के संदर्भ में ले जाते समय क्रमबद्ध किया जाता है।
SELECT *, FIELD(id,3,2,1,4) AS f FROM mytable WHERE id IN (3,2,1,4);
फिर जोड़ेंORDER BY f
याORDER BY FIELD(id,3,2,1,4)
पुनः प्रयास करें।