2010-01-12 10 views
7

बस एक सवाल बहुत इस एक के समान ... पूछाMySQL orderBy एक नंबर, रिक्त स्ट्रिंग (या 0 के) अंतिम

वर्तमान में मैं एक बहुत ही बुनियादी OrderBy मेरे बयान में कर रही हूँ।

SELECT * FROM tablename WHERE visible=1 ORDER BY position ASC, id DESC 

इस के साथ समस्या यह है कि 'स्थिति' के लिए रिक्त स्ट्रिंग प्रविष्टियों स्थिति के साथ 0. के रूप में इसलिए सभी प्रविष्टियों का इलाज कर रहे रिक्त स्ट्रिंग के रूप में 1,2,3,4 के साथ उन लोगों से पहले दिखाई देते हैं। उदाहरण के लिए:

'', '', '', 1, 2, 3, 4

या

0, 0, 0, 1, 2, 3, 4

वहाँ है निम्नलिखित आदेश प्राप्त करने का एक तरीका:

1, 2, 3, 4, '', '', ''।

या

1, 2, 3, 4, 0, 0, 0

मुझे लगता समाधान समारोह की जगह किसी तरह का हो सकता है, लेकिन मैं एक समारोह ढूँढने में सक्षम नहीं किया गया है जो गूगल के माध्यम से मैं क्या करता हूं।

कई धन्यवाद,

JonB

उत्तर

15
SELECT * 
FROM tablename 
WHERE visible=1 
ORDER BY 
    case when position in('', '0') then 1 else 0 end, 
    position ASC, 
    id DESC 
+1

मुझे लगता है कि यह काम करेगा लेकिन यह सबसे अच्छा समाधान नहीं है। मुझे लगता है कि 'स्थिति' एक पूर्णांक स्तंभ होना चाहिए, और यदि ऐसा है, तो' केस 'अभिव्यक्ति को पूर्णांक का भी उपयोग करना चाहिए, स्ट्रिंग नहीं। यदि 'स्थिति' एक पूर्णांक या कम से कम संख्यात्मक नहीं है, तो संख्याओं के रूप में क्रमबद्ध करना वैसे भी काम नहीं करेगा। साथ ही, यह समाधान सॉर्ट करने के लिए एक नया कॉलम जोड़ता है, जो प्रदर्शन पर नकारात्मक प्रभाव डाल सकता है।अगर मेरी धारणा है कि 'स्थिति' वास्तव में एक पूर्णांक सही है, तो ओपी का अर्थ संभवतः 'शून्य' मान है जहां उन्होंने 'खाली स्ट्रिंग' लिखा था, जिसका अर्थ है कि आप आसानी से 'ऑर्डर द्वारा कोलेसेस (स्थिति, ~ 0), आईडी डीईएससी' लिख सकते हैं। –

+0

@ रोलैंड: ओपी ने स्पष्ट रूप से स्पष्ट किया कि स्थिति एक स्ट्रिंग है: * "इसके साथ समस्या यह है कि 'स्थिति' के लिए खाली स्ट्रिंग प्रविष्टियां 0 के रूप में मानी जाती हैं।" * – RedFilter

+0

OrbMan हाँ, उन्होंने किया। और मैं कह रहा हूं कि यह शायद समस्या का हिस्सा है। मेरा सुझाव था कि बाद में इसे ऊपर उठाने की कोशिश करने के बजाय इसे उचित डेटा प्रकार सामने दें। –

0

आप जहां एक का चयन आईडी> 0 और नहीं खाली और अन्य खाली चयन और 0 केवल

1

आप कोशिश कर सकते हैं दो उप प्रश्नों में शामिल होने की कोशिश कर रहा कर सकते हैं एक CASE statement, इस तरह:

SELECT * 
FROM tablename 
WHERE visible = 1 
ORDER BY CASE position WHEN '' THEN '9999' ELSE position END CASE ASC, 
    ID DESC 
+0

मुझे एहसास है कि यह एक पुराना जवाब है, लेकिन यह सिर्फ मेरे बट को बचा लिया है। धन्यवाद दोस्त! – mingos

1

आप कहते हैं कि position में खाली स्ट्रिंग प्रविष्टियां हैं ... क्या आपको वास्तव में खाली स्ट्रिंग का मतलब है, या आपका मतलब NULL है? यह वास्तव में NULL प्रविष्टियों शामिल हैं, तो आप Orbman के बयान के एक मामूली संशोधन का उपयोग करना चाहिए:

SELECT * 
FROM tablename 
WHERE visible=1 
ORDER BY 
    COALESCE(position, ~0) 
, id DESC 

COALESCE() पहला तर्क यह है कि NOT NULL का मान देता है। ~ 0 काला जादू का एक टुकड़ा है जो आपको MySQL द्वारा समर्थित अधिकतम पूर्णांक मान प्राप्त करेगा। (~ थोड़ा सा नकारात्मकता करता है, सभी 0 बिट्स को 1 में बदल देता है)। तो, इस मामले में, यदि position IS NULL सत्य है, तो यह 18446744073709551615 वापस करेगा, अन्यथा यह position का मान वापस करेगा।

मैं यह भी इंगित करना चाहता हूं कि आपके position कॉलम का डेटा प्रकार कुछ पूर्णांक प्रकार का होना चाहिए (http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html देखें)। क्योंकि आप खाली तारों का उल्लेख करते हैं, मुझे लगता है कि आपको SHOW CREATE TABLE <tablename> करके अपनी तालिका परिभाषा की जांच करनी चाहिए। यदि स्थिति एक पूर्णांक प्रकार नहीं है, तो मैं आपको इसे बदलने की सलाह दूंगा। मुख्य कारण यह है कि स्ट्रिंग्स, भले ही वे संख्याओं की तरह दिखें, संख्याओं के रूप में क्रमबद्ध न हों।

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