2010-03-01 16 views
60

में अगर मैं कहता हूँ:अधिकतम (लंबाई (क्षेत्र)) mysql

select max(length(Name)) 
    from my_table 

मैं 18 के रूप में परिणाम प्राप्त है, लेकिन मैं भी चिंतित डेटा चाहते हैं। तो अगर मैं कहता हूं:

select max(length(Name)), 
     Name 
    from my_table 

... यह काम नहीं करता है। मुझे लगता है कि एक आत्म शामिल होना चाहिए जो मुझे लगता है कि मैं इसे समझने में असमर्थ हूं।

क्या कोई मुझे एक सुराग प्रदान कर सकता है?

+4

मैं सुझाव है कि आप CHAR_LENGTH का उपयोग कर विचार() लंबाई के बजाय()। CHAR_LENGTH() वर्णों में एक स्ट्रिंग की लंबाई देता है। LENGTH() बाइट्स में इसकी लंबाई देता है। बहु-बाइट चरित्र सेट के लिए ये मान अलग-अलग हो सकते हैं, और आप शायद वर्ण की लंबाई से संबंधित हैं, बाइट लंबाई नहीं। –

उत्तर

11

संपादित, अज्ञात अधिकतम के लिए काम करेंगे() मान:

select name, length(name) 
from my_table 
where length(name) = (select max(length(name)) from my_table); 
+0

हां, लेकिन मुझे संबंधित 'नाम' चाहिए जिसमें 18 – JPro

+1

की अधिकतम लंबाई है, ठीक है, मैं इसे प्राप्त करने में कामयाब रहा हूं, 'अधिकतम (लंबाई (नाम)) को num1 के रूप में चुनें, my_table समूह से नाम num1 = 18' , क्योंकि मुझे पहली क्वेरी से पता है कि अधिकतम 18 है। लेकिन इसे एक प्रश्न में कैसे जोड़ना है? – JPro

+0

आह, ठीक है, मैंने इसे गलत समझा। एमएस एसक्यूएल में मैं my_table से चुनिंदा नाम का उपयोग करूंगा जहां लंबाई (नाम) = (my_table से अधिकतम (लंबाई (नाम)) का चयन करें), लेकिन मैं काफी निश्चित हूं कि MySQL वाक्यविन्यास सही नहीं है। – cjohn

0

मैं तुम्हें इसी प्रकार के एक समाधान इस्तेमाल कर सकते हैं लगता है:

select name, length(name) 
from users 
where id = (
    select id 
    from users 
    order by length(name) desc 
    limit 1 
); 

इष्टतम समाधान है, हालांकि हो सकता है। .. लेकिन काम करने लगता है।

1
select * 
from my_table 
where length(Name) = ( 
     select max(length(Name)) 
     from my_table 
     limit 1 
); 

इसमें दो टेबल स्कैन शामिल हैं, और इसलिए बहुत तेज़ नहीं हो सकता है!

+0

उप-क्वेरी में सीमा अनावश्यक है: अधिकतम() एक समेकन ऑपरेटर है और केवल 1 पंक्ति लौटाएगा। – Martin

2

उपयोग:

SELECT mt.name 
    FROM MY_TABLE mt 
GROUP BY mt.name 
    HAVING MAX(LENGTH(mt.name)) = 18 

... यह सोचते हैं आप लंबाई पहले से पता है। आप नहीं करते हैं, का उपयोग करें:

SELECT mt.name 
    FROM MY_TABLE mt 
    JOIN (SELECT MAX(LENGTH(x.name) AS max_length 
      FROM MY_TABLE x) y ON y.max_length = LENGTH(mt.name) 
+0

यह इष्टतम है? – JPro

+0

@ जेपीआरओ: व्याख्या योजना की जांच करें, लेकिन मुझे लगता है कि क्वास्नोई सबसे इष्टतम है। –

118
SELECT name, LENGTH(name) AS mlen 
FROM mytable 
ORDER BY 
     mlen DESC 
LIMIT 1 
+6

+1: सादगी के लिए, या "मैं इसके बारे में क्यों नहीं सोचा था" –

+0

आपको सोचने की ज़रूरत नहीं है, बस पूछें, यह अधिक आसान है। : -> – wener

+2

हाँ, बस सब कुछ पूछो और कुछ के बारे में मत सोचो।यह उचित लगता है। -.- – alexander

1
Select URColumnName From URTableName Where length(URColumnName) IN 
(Select max(length(URColumnName)) From URTableName); 

यह आप उस विशेष स्तंभ जो अधिकतम लंबाई है में रिकॉर्ड दे देंगे।

1

मामले में आप दोनों अधिकतम और एक ही मेज से मिनट की जरूरत है:

select * from (
(select city, length(city) as maxlen from station 
order by maxlen desc limit 1) 
union 
(select city, length(city) as minlen from station 
order by minlen,city limit 1))a; 
2

ठीक है (.. MySQL, SLQ सर्वर, ओरेकल, एमएस एक्सेस) मुझे यकीन है कि क्या आप का उपयोग कर रहे हैं नहीं कर रहा हूँ, लेकिन आप कर सकते हैं नीचे दिए गए कोड को आज़माएं। यह डब्ल्यू 3 स्कूली उदाहरण डीबी में काम करता है। Here इस प्रयास करें:

SELECT city, max(length(city)) FROM Customers; 
संबंधित मुद्दे