mysql'de max (uzunluk (alan))


86

Söylersem:

select max(length(Name)) 
  from my_table

Sonucu 18 olarak alıyorum, ancak ilgili verileri de istiyorum. Yani dersem:

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

...İşe yaramıyor. Bir kendi kendine katılma olmalı, sanırım bunu çözemiyorum.

Lütfen birisi bana bir ipucu verebilir mi?


6
LENGTH () yerine CHAR_LENGTH () kullanmanızı tavsiye ederim. CHAR_LENGTH (), karakter cinsinden bir dizenin uzunluğunu döndürür. LENGTH () uzunluğunu bayt cinsinden döndürür. Çok baytlı karakter kümeleri için bu değerler farklı olabilir ve muhtemelen bayt uzunluğuyla değil, karakter uzunluğuyla ilgileniyorsunuz.
Ike Walker

Yanıtlar:


160
SELECT  name, LENGTH(name) AS mlen
FROM    mytable
ORDER BY
        mlen DESC
LIMIT 1

14

Düzenlendi, bilinmeyen maksimum () değerler için çalışacak:

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

evet, ancak nameazami uzunluğu 18 olan ilgili kişiyi istiyorum
JPro

1
ok select max(length(Name)) as num1,Name from my_table group by Name having num1 = 18İlk sorgudan maks. 18 olduğunu bildiğim için, istediğimi böyle elde etmeyi başardım . Ama bunu bir sorgu ile nasıl birleştirebilirim?
JPro

Ah, tamam, yanlış anladım. MS SQL'de, my_table'dan, length (Name) = (my_table'dan max (length (Name)) seçin), ancak MySQL sözdiziminin doğru olmadığından oldukça eminim.
cjohn

7

Tamam, ne kullandığınızı bilmiyorum (MySQL, SLQ Server, Oracle, MS Access ..) Ancak aşağıdaki kodu deneyebilirsiniz. W3School örnek DB'de çalışır. İşte şunu dene:

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

2

Kullanım:

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

... uzunluğu önceden bildiğinizi varsayarsak. Eğer yapmazsan kullan:

  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)

@JPro: Açıklama planını kontrol edin, ancak Quassnoi'nin muhtemelen en uygun olanı olduğunu düşünüyorum.
OMG Midilli

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

Bu size, maksimum uzunluğa sahip belirli bir sütundaki kayıtları verecektir.


2

Aynı tablodan hem max hem de min'e ihtiyacınız olması durumunda:

    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 
);

Bu, iki masa taramasını içerir ve bu nedenle çok hızlı olmayabilir!


Alt sorgudaki sınır gereksizdir: max () bir toplama operatörüdür ve yalnızca 1 satır döndürür.
Martin


0

Sanırım bunun gibi bir çözüm kullanabilirsiniz:

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

Yine de optimal çözüm olmayabilir ... Ama işe yarıyor gibi görünüyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.