mysql SQL: विशिष्ट आइटम पहले और फिर बाकी आइटम सॉर्ट करने के लिए


80

आओ हम नीचे दी गई तालिका कहते हैं।

मैं सभी दोस्तों को प्राप्त करना चाहता हूं, लेकिन मैं चाहता हूं कि आईडी 5 सूची में पहला आइटम हो। मुझे उस आदेश की परवाह नहीं है जो मुझे बाकी वस्तुओं से प्राप्त होता है।

वांछित क्वेरी परिणाम होगा:

friends
-------

id    name

5     nahum
1     moshe
2     haim
3     yusuf
4     gedalia
6     dana

मैं यह कैसे कर सकता हूँ?

मैसकल 5.1.x का उपयोग करना।

धन्यवाद!

जवाबों:


148
select id,name 
from friends 
order by id=5 desc

(आप बाकी के आदेश के बारे में परवाह नहीं है, अन्यथा, जैसे आईडी आईडी द्वारा आराम )

select id,name 
from friends 
order by id=5 desc, id asc

10
@ maxx777 इस सवाल का नाम MySQL है, जो अब ओरेकल के स्वामित्व में है। Microsoft SQL सर्वर की तरह "sql-server" नहीं।
रिचर्ड द किवी 21

1
मुझे लगता है कि अधिकांश प्रश्न सभी DBMS पर काम करते हैं। और अगर कोई कहता है कि यह क्वेरी किसी विशेष DBMS पर काम नहीं कर रही है, तो आमतौर पर वह उस विशेष DBMS के लिए समाधान के लिए पूछ रहा है।
मैक्सएक्स .x

8
@ maxx777 यही कारण है कि हमारे पास टैग और अलग प्रश्न हैं। यह उसकी MySQL समस्या के लिए पूछने वाले के लिए काम करता है। यदि आप SQL सर्वर 2005 चाहते हैं, तो दूसरे उत्तर में यह है, इस पर टिप्पणी करने की कोई आवश्यकता नहीं है कि यह उत्तर उस पर काम नहीं करता है जिस पर काम करने के लिए इसे कभी विज्ञापित नहीं किया गया था।
रिचर्ड द किवी

48

इसे इस्तेमाल करे:

select id,name 
from friends 
order by case when id=5 then -1 else id end

यदि आपके पास अधिक है तो आप एक कर सकते हैं:

select id,name 
from friends 
order by case when id in (5,15,25) then -1 else id end,id

4

मैं अब परीक्षण करने के लिए एक MySQL तक नहीं पहुँच सकता, इसलिए यह उलटा हो सकता है ... लेकिन आप इस तथ्य का उपयोग कर सकते हैं कि बुलियन भी सॉर्ट करते हैं, और आपके पास कई सॉर्ट फ़ील्ड हो सकते हैं।

SELECT ... ORDER BY id != 5, id

(आपको लिखना पड़ सकता है id = 5, मुझे याद नहीं आ सकता है कि TRUEs FALSEs से पहले या बाद में छाँटे जाएँ।)

संपादित करें: ओह, मैंने अभी पढ़ा है कि आप बाकी के आदेश की परवाह नहीं करते हैं, जिस स्थिति में मैं दिल से @ रिचर्ड के जवाब की सिफारिश करता हूं।


3
मैं पसंद करता हूं id=5 desc, क्योंकि जब कॉलम में नल शामिल होते हैं , तो सबसे !=5पहले नल
डालते हैं

2

यदि आप UNION क्वेरी के लिए भी ऐसा ही करना चाहते हैं, उदाहरण के लिए यदि आपके पास है:

select id,name 
from friends 
UNION
select id,name 
from friends 
order by id=5 desc

... आपको PostgreSQL में एक अपवाद मिलेगा:

केवल परिणाम स्तंभ नाम का उपयोग किया जा सकता है, न कि अभिव्यक्ति या कार्य। सुझाव: हर चयन में अभिव्यक्ति / कार्य जोड़ें, या एक खंड से यूनिअन को स्थानांतरित करें

इसे प्राप्त करने के लिए, आप निम्नलिखित का उपयोग करेंगे:

select id,name, (id=5) AS is_five
from friends 
UNION
select id,name, (id=5) AS is_five
from friends 
order by is_five DESC, id DESC

अभिव्यक्ति (id = 5) 't' या 'f' लौटाएगी, यह इस बात पर निर्भर करता है कि आपका स्तंभ मान समान है या अपेक्षित मान नहीं है (5), इसलिए आदेश पहले 't' कॉलम को क्रमबद्ध करेगा, फिर आराम।


2

इसे हल करने के लिए आपको MySQL के ORDER BY FIELD क्लॉज का उपयोग करना चाहिए। हालाँकि, इस पर जवाब स्वीकार कर लिया गया है, यहाँ एक बेहतर समाधान है।

select 1 id, 'Zeta' order_col union all
select 2 id, 'Alpha' order_col union all
select 3 id, 'Gamma' order_col union all
select 4 id, 'Phi' order_col union all
select 5 id, 'Delta' order_col union all
select 6 id, 'Delta' order_col union all
select 7 id, 'Alpha' order_col union all
select 8 id, 'Gamma' order_col union all
select 9 id, 'Zeta' order_col union all
select 10 id, 'Phi' order_col 
order by field (order_col, 'Alpha', 'Gamma', 'Phi', 'Delta', 'Zeta'), id;

इससे बेहतर है

  • id = something, order by id asc
  • जब कुछ होता है तब केस क्रम से 1 जब कुछ कुछ होता है तो 2 एंड डेस्क

1
यकीन नहीं हो रहा था कि यह क्यों ठुकरा दिया गया। मैं जानना चाहता हूं कि फ़ील्ड द्वारा ऑर्डर बेहतर क्यों होना चाहिए लेकिन इसका जवाब दिलचस्प है ..
जॉन

@ जॉन - यह पठनीयता में आसानी के कारण बेहतर है। इसके अलावा, यह एक समाधान है कि MySQL हमें बॉक्स से बाहर प्रदान कर रहा है। यह सिर्फ मुझे लगता है कि जब आपको किसी कॉलम में बहुत सारे मानों के लिए ऑर्डर निर्दिष्ट करना होता है, तो यह अधिक समझ में आता है।
मोंटी पाइथन

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

मैं अपने सभी उत्तरों की जाँच @ स्ट्राबेरी के पोस्ट - meta.stackoverflow.com/questions/333952/… को ध्यान में रखकर करता हूँ
मोंटीप्यंथन

2

आप field()MySQL में उपयोग कर सकते हैं ।

select id,name from friends order by field(id,5,id)

फ़ील्ड में 1 पैरामीटर () का अर्थ है कि जिस क्षेत्र के साथ आप सॉर्ट करना चाहते हैं, बाकी ऑर्डर दे रहा है।

तो 5 पहले क्रमबद्ध होंगे, और बाकी आईडी से (5 के बिना)। field(id,5,1,3,id)यदि आप चाहते हैं कि आप 5,1,3 सामने हों तो आप ऐसा कर सकते हैं ।

5 को अंतिम क्रम में क्रमबद्ध करने का विकल्प चुन सकते हैं field(id,id,5)। दूसरी आईडी से 5 को भी बाहर रखा जाएगा।


-7

यह थोड़ा बदसूरत है क्योंकि इसमें कोड दोहराव है, लेकिन यह चाल है:

select .... where id = 5 
union
select .... where not id = 5

2
यदि यूनियन के बाद पंक्तियों का आदेश दिया जाता है, तो यह केवल एक दुर्घटना है। और यदि आप एक निर्दिष्ट करते हैं order by, तो यह संपूर्ण संघ को सॉर्ट करेगा।
एंडोमर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.