max (comprimento (campo)) no mysql

86

Se eu disser:

select max(length(Name)) 
  from my_table

Recebo o resultado como 18, mas também quero os dados em questão. Então, se eu disser:

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

...não funciona. Deve haver uma auto-junção, eu acho que não consigo descobrir.

Alguém pode me dar uma pista?

JPro
fonte
5
Eu recomendo que você considere usar CHAR_LENGTH () em vez de LENGTH (). CHAR_LENGTH () retorna o comprimento de uma string em caracteres. LENGTH () retorna seu comprimento em bytes. Para conjuntos de caracteres multibyte, esses valores podem ser diferentes e você provavelmente está preocupado com o comprimento dos caracteres, não com o comprimento dos bytes.
Ike Walker

Respostas:

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

Editado, funcionará com valores máximos () desconhecidos:

select name, length( name )
from my_table
where length( name ) = ( select max( length( name ) ) from my_table );
cjohn
fonte
sim, mas eu quero a preocupação nameque tem no máximo 18
JPro 01 de
1
ok consegui assim o que quero select max(length(Name)) as num1,Name from my_table group by Name having num1 = 18, pois sei desde a primeira consulta que o máximo é 18. Mas como combinar isso para uma consulta?
JPro 01 de
Ah, ok, eu entendi mal. No MS SQL eu usaria select Name from my_table onde length (Name) = (select max (length (Name)) from my_table), mas estou quase certo de que não é a sintaxe correta do MySQL.
cjohn 01 de
7

Ok, não tenho certeza do que você está usando (MySQL, SLQ Server, Oracle, MS Access ..) Mas você pode tentar o código abaixo. Funciona no banco de dados de exemplo W3School. Aqui, tente isto:

SELECT city, max(length(city)) FROM Customers;
Velizar Andreev Kitanov
fonte
2

Usar:

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

... supondo que você saiba o comprimento de antemão. Se não, use:

  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)
Pôneis OMG
fonte
este é o ideal?
JPro 01 de
@JPro: Verifique o plano de explicação, mas acho que o de Quassnoi é provavelmente o mais ideal.
Pôneis OMG de
2
Select URColumnName From URTableName Where length(URColumnName ) IN 
(Select max(length(URColumnName)) From URTableName);

Isso lhe dará os registros daquela coluna específica que possui o comprimento máximo.

Merish Joseph
fonte
2

Caso você precise de máximo e mínimo da mesma mesa:

    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;
Suman
fonte
1
select * 
from my_table 
where length( Name ) = ( 
      select max( length( Name ) ) 
      from my_table
      limit 1 
);

Isso envolve duas varreduras de tabela e, portanto, pode não ser muito rápido!

Martin
fonte
O limite na subconsulta é desnecessário: max () é um operador de agregação e retornará apenas 1 linha.
Martin
1

Use CHAR_LENGTH () em vez de LENGTH () como sugerido em: MySQL - length () vs char_length ()

SELECT nome, CHAR_LENGTH (nome) AS mlen FROM mytable ORDER BY mlen DESC LIMIT 1

Rajesh Goel
fonte
0

Suponho que você possa usar uma solução como esta:

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

Pode não ser a solução ideal, porém ... Mas parece funcionar.

Pascal MARTIN
fonte