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?


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

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

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;

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)

¿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.


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;

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!


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.