2012-08-06 4 views
6

मैं जो इनपुट पैरामीटर के आधार पर एक resultset पैदावार और परिणाम विभिन्न मापदंडों के आधार पर क्रमबद्ध किया जा सके (एएससी/DESC) एक खोज क्वेरी है अब मुझे एक आवश्यकता है जिसमें, यदि मेरे पास id पास हो गया है, तो मैं दिए गए परिणाम में शीर्ष पर चिपचिपा होने के लिए इसी रिकॉर्ड को बनाना चाहता हूं।यह सुनिश्चित करने के लिए कि mysql में किसी दिए गए परिणाम में रिकॉर्ड हमेशा शीर्ष पर होता है? किराए, अवधि आदि (जगह में पृष्ठांकन और 10 रिकॉर्ड की सीमा के साथ)</p> <p>:

चलें कहते हैं कि हम इस तरह एक पैकेज तालिका है:

Package 
- id 
- name 
- mPrice 
- vPrice 
- duration 

// Searching pkg based on Price (in DESC order) where name = Thailand 
sqlQuery = 
"SELECT p.id, p.name, p.mPrice, p.vPrice FROM package p 
WHERE p.name = LOWER('Thailand') 
ORDER BY (p.mPrice + p.vPrice) DESC 
LIMIT 10" 

के पूरा resultset मान लेते आईडी के साथ 20 रिकॉर्ड 1 20. करने के लिए मैं अब आईडी 14 हमेशा पर होना के साथ रिकॉर्ड वापस जाने के लिए आवश्यक कर रहा हूँ है चोटी। मैं निम्न क्वेरी के साथ आया था, लेकिन इस काम नहीं कर रहा:

sqlQuery = 
"SELECT p.id, p.name, p.mPrice, p.vPrice FROM package p 
WHERE p.name = LOWER('Thailand') or p.id = 14 
ORDER BY CASE 
WHEN p.id=14 then 0 
else (p.mPrice + p.vPrice) 
end DESC 
LIMIT 10" 

के रूप में मेरा अनुमान है क्यों यह काम नहीं कर रहा: खंड द्वारा आदेश के बाद, resultset अवरोही क्रम है, जो तब से काट दिया गया है में क्रमबद्ध हो जाता 10 रिकॉर्ड आईडी = 14 के साथ रिकॉर्ड इस कटा हुआ सेट का हिस्सा नहीं हो सकता है। क्या ये सही है ?

मैं शीर्ष पर चिपकने के लिए id = 14 के साथ रिकॉर्ड कैसे प्राप्त करूं?

उत्तर

16
ORDER BY (p.id=14) DESC, (p.mPrice=p.vPrice) DESC 

p.id=14 रिटर्न 1 अगर हालत सच है हो सकता है, 0 अन्यथा, इसलिए छँटाई उतरते शीर्ष करने के लिए वांछित पंक्ति लाता है।

तुलना से एक नंबर लौटने के बाद एक MySQL विशेषता है मानक SQL के साथ आप लिखते हैं:

ORDER BY CASE WHEN (p.id=14) THEN 0 ELSE 1 END, 
     CASE WHEN (p.mPrice=p.vPrice) THEN 0 ELSE 1 END 

मैं इस आसान UNION से पढ़ने के लिए मिल जाए, और यह बेहतर प्रदर्शन कर सकती है।

+0

पर रहेगा बहुत अच्छा! इस बारे में सोचना चाहिए था। हालांकि, यह काम नहीं किया जब मैंने एएससी के साथ इसे सॉर्ट करने का प्रयास किया और मुझे यकीन नहीं है कि क्यों। 'ऑर्डर द्वारा (पी.आईडी = 14) एएससी, (पी.एमप्रिस = पी.पीप्रिस) एएससी ' – brainydexter

+1

' पी.आईडी = 14' रिटर्न '1' अगर शर्त सही है, तो अन्यथा। आरोही आरोही '0' पहले रखती है, तो जो आप चाहते हैं वह आखिरी बार आता है ... –

+0

आह! महान। मैं बस एएससी/डीईएससी के आधार पर समानता ऑपरेटर को आईडी पर फिसल दूंगा। क्या आपके पास कोई विचार है यदि यह यूनियन से बेहतर प्रदर्शन कर सकता है? – brainydexter

2

एक संघ का प्रयोग हमेशा शीर्ष पर अपने पैकेज के लिए:

SELECT id, name, mPrice, vPrice FROM package WHERE id = 14 
UNION 
SELECT p.id, p.name, p.mPrice, p.vPrice FROM package p 
WHERE p.name = LOWER('Thailand') or p.id = 14 
ORDER BY (p.mPrice = p.vPrice) DESC 
LIMIT 9 
+2

'यूनियन ऑल' 'यूनियन 'ऑपरेशन से तेज़ है। – Omesh

+0

लेकिन आप शीर्ष पर आईडी 14 नहीं चाहते हैं और एक बार "बॉडी" – Matten

0

इस प्रयास करें:

order by 
case when p.id=14 then then (select MAX(mPrice)+1 from package) else 
(p.mPrice = p.vPrice) end desc 
LIMIT 10 
के बजाय

(चयन मैक्स (p.mPrice) +1 पैकेज से) आप एक निरंतर मान दे सकता है जो हमेशा एक अधिकतम मूल्य होगा,

order by 
case when p.id=14 then then 1000000 else 
(p.mPrice = p.vPrice) end desc 
LIMIT 10 

जो अधिक effitient

+0

में क्या आप कृपया उस अभिव्यक्ति में क्या कर रहे हैं उसे समझा सकते हैं? – brainydexter

+0

@brainydexter: मुझे कीमत के लिए अधिकतम मूल्य + 1 मिल रहा है, ताकि यह हमेशा शीर्ष –