mysql में अधिकतम (लंबाई (क्षेत्र))


86

अगर मैं कहूं:

select max(length(Name)) 
  from my_table

मुझे 18 के रूप में परिणाम मिलता है, लेकिन मुझे संबंधित डेटा भी चाहिए। तो अगर मैं कहूं:

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

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

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


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

जवाबों:



14

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

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

हाँ, लेकिन मैं चाहता हूँ कि संबंधित nameजो अधिकतम 18 है
जेपीआरो

1
ठीक है, मैं इस तरह से प्राप्त करना चाहता हूं select max(length(Name)) as num1,Name from my_table group by Name having num1 = 18क्योंकि मैं पहली क्वेरी से जानता हूं कि अधिकतम 18 है। लेकिन इसे एक क्वेरी में कैसे संयोजित किया जाए?
जेपीआरो

आह, ठीक है, मैं गलत था। MS SQL में मैं my_table से जहाँ सेलेक्ट नेम (Name) = (select (मैक्सिमम (Name)) my_table से) के नाम का उपयोग करता हूँ, लेकिन मैं काफी निश्चित हूँ कि MySQL सिंटैक्स सही नहीं है।
cjohn

7

ठीक है, मुझे यकीन नहीं है कि आप क्या उपयोग कर रहे हैं (MySQL, SLQ सर्वर, Oracle, MS Access ..) लेकिन आप नीचे दिए गए कोड को आज़मा सकते हैं। यह W3School उदाहरण DB में काम करता है। यहाँ यह कोशिश:

SELECT city, max(length(city)) FROM Customers;

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)

क्या यह इष्टतम है?
जेपीरो

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

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

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


2

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

    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;

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

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


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


0

मुझे लगता है कि आप इस तरह के रूप में एक समाधान का उपयोग कर सकते हैं:

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.