2013-05-11 7 views
7

कहते हैं कि मैं एक मेज जो चालान संख्या लिए एक कॉलम होता है कि चलो, डेटा प्रकार की तरह मिश्रित स्ट्रिंग/पूर्णांक मूल्यों के साथ VARCHAR है:अधिकतम मिश्रित स्ट्रिंग/int कॉलम का चयन कैसे करें?

invoice_number 
************** 
    HKL1 
    HKL2 
    HKL3 
    ..... 
    HKL12 
    HKL13 
    HKL14 
    HKL15 

मैं इसके बारे में अधिकतम चयन करने के लिए कोशिश की, लेकिन इसके साथ देता है " एचकेएल 9 ", उच्चतम मूल्य" HKL15 "नहीं है। क्योंकि वे तारों के रूप में तुलना की जाती है

SELECT MAX(invoice_number) 
FROM `invoice_header` 

उत्तर

16

HKL9 (स्ट्रिंग), HKL15 से अधिक है। आपकी समस्या से निपटने का एक तरीका एक कॉलम फ़ंक्शन को परिभाषित करना है जो चालान संख्या का केवल संख्यात्मक हिस्सा देता है।

आपके सभी चालान नंबर HKL के साथ शुरू है, तो आप उपयोग कर सकते हैं:

SELECT MAX(CAST(SUBSTRING(invoice_number, 4, length(invoice_number)-3) AS UNSIGNED)) FROM table 

यह INVOICE_NUMBER 3 पहले पात्रों को छोड़कर लेता है, इंट में बदलता है, और इसे से अधिकतम चयन करता है।

+0

धन्यवाद @nakosspy, लेकिन मैं php/mysql का उपयोग करके ऐसा कैसे कर सकता हूं? – CairoCoder

+0

कथन मानक एसक्यूएल है। आप इसे किसी अन्य कथन के रूप में निष्पादित कर सकते हैं। – nakosspy

+0

मुझे यह मिला, यह है: अधिकतम चयन करें (substring (invoice_number, 4, लंबाई (invoice_number) -3)) तालिका – CairoCoder

2

आपकी समस्या परिभाषा & डिज़ाइन में से एक है।

उच्चतम आईडी या DATE, साथ चालान संख्या का चयन करें या - परिभाषित एक अतिरिक्त स्तंभ, जो चालान संख्या के साथ संबंध स्थापित करता है और है - उन वास्तव में के साथ "उच्चतम चालान संख्या" मेल नहीं खाते हैं, तो गरीब डेटाबेस को समझने के लिए काफी सरल है।

select INVOICE_NUMBER 
from INVOICE_HEADER 
order by ID desc limit 1; 

ऐसा नहीं है कि डेटाबेस पर्याप्त स्मार्ट नहीं है .. यह है कि आप इसे गलत सवाल पूछ रहे हैं।

+0

धन्यवाद @ थॉमस डब्ल्यू, लेकिन अगर मैं गलत तरीके से पूछ रहा हूं, तो मुझे इसके लिए कैसे पूछना चाहिए? – CairoCoder

+1

मुझे लगता है कि यह भी desc द्वारा आदेश है। – CairoCoder

+0

उच्चतम क्रमांकित चालान सबसे हालिया होना चाहिए; आईडी द्वारा, या तिथि से। आपको डेटाबेस को मनमाने ढंग से तारों को डीकोड करने की उम्मीद नहीं करनी चाहिए, लेकिन प्राथमिक प्राथमिक कुंजी स्कैन करने में वे वास्तव में तेज़ हैं :) –

4

चयन ifnull (अधिकतम (परिवर्तित (INVOICE_NUMBER, साइन्ड इंटीजर)), 0) invoice_header जहां INVOICE_NUMBER regexp '^ [0-9] + $'

+0

यह एकमात्र सही उत्तर है क्योंकि यह चालान संख्याओं के अलग-अलग प्रारूपों के बावजूद काम करता है और यह संशोधित किए बिना काम करता है डेटाबेस। – Vincent

1

यह काम करना चाहिए भी

SELECT invoice_number 
FROM invoice_header 
ORDER BY LENGTH(invoice_number) DESC,invoice_number DESC 
LIMIT 0,1 
1

से खोज के थोड़ी देर बाद मुझे इसका सबसे आसान समाधान मिला।

select MAX(CAST(REPLACE(REPLACE(invoice_number , 'HKL', ''), '', '') as int)) from invoice_header 
संबंधित मुद्दे