max (longitud (campo)) en mysql

86

Si yo digo:

select max(length(Name)) 
  from my_table

Obtengo el resultado como 18, pero también quiero los datos correspondientes. Entonces, si digo:

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

...No funciona. Debería haber una autounión, supongo, que no puedo resolver.

¿Alguien puede darme una pista?

JPro
fuente
5
Le recomendaría que considere usar CHAR_LENGTH () en lugar de LENGTH (). CHAR_LENGTH () devuelve la longitud de una cadena en caracteres. LENGTH () devuelve su longitud en bytes. Para conjuntos de caracteres de varios bytes, estos valores pueden ser diferentes y probablemente le preocupe la longitud de los caracteres, no la longitud de los bytes.
Ike Walker

Respuestas:

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

Editado, funcionará para valores máximos () desconocidos:

select name, length( name )
from my_table
where length( name ) = ( select max( length( name ) ) from my_table );
john
fuente
sí, pero quiero que el interesado nametenga una duración máxima de 18
JPro
1
De acuerdo, logré obtener lo que quiero así select max(length(Name)) as num1,Name from my_table group by Name having num1 = 18, ya que sé por la primera consulta que el máximo es 18. Pero, ¿cómo combinar esto en una sola consulta?
JPro
Ah, está bien, lo interpreté mal. En MS SQL, usaría select Name from my_table donde length (Name) = (select max (length (Name)) from my_table), pero estoy bastante seguro de que no es la sintaxis correcta de MySQL.
cjohn
7

Ok, no estoy seguro de qué estás usando (MySQL, SLQ Server, Oracle, MS Access ...) Pero puedes probar el código a continuación. Funciona en la base de datos de ejemplo de W3School. Aquí prueba esto:

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

Utilizar:

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

... asumiendo que conoces la longitud de antemano. Si no lo hace, 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)
Ponis dios mio
fuente
¿Es este el óptimo?
JPro
@JPro: Verifique el plan de explicación, pero creo que el de Quassnoi es probablemente el más óptimo.
OMG Ponies
2
Select URColumnName From URTableName Where length(URColumnName ) IN 
(Select max(length(URColumnName)) From URTableName);

Esto le dará los registros en esa columna en particular que tiene la longitud máxima.

Merish Joseph
fuente
2

En caso de que necesite max y min de la misma tabla:

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

Si esto implica dos escaneos de tabla, ¡puede que no sea muy rápido!

Martín
fuente
El límite en la subconsulta no es necesario: max () es un operador de agregación y solo devolverá 1 fila.
Martin
0

Supongo que podrías usar una solución como esta:

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

Sin embargo, puede que no sea la solución óptima ... Pero parece funcionar.

Pascal MARTIN
fuente