2010-03-01 22 views
60

Si digo:max (longitud (campo)) en MySQL

select max(length(Name)) 
    from my_table 

puedo obtener el resultado como 18, pero quiero que los datos en cuestión también. Entonces si digo:

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

... no funciona. Debería haber una auto-unión, supongo que no puedo resolverlo.

¿Alguien puede darme una pista?

+4

Yo recomendaría que se considere el uso de CHAR_LENGTH() en lugar de la longitud(). CHAR_LENGTH() devuelve la longitud de una cadena en caracteres. LENGTH() devuelve su longitud en bytes. Para conjuntos de caracteres multibyte, estos valores pueden ser diferentes, y probablemente le interese la longitud del carácter, no la longitud del byte. –

Respuesta

11

Editado, trabajará para max desconocido() valores:

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

sí, pero quiero el 'nombre' en cuestión que tiene un valor máximo de 18 – JPro

+1

bien Logré obtener lo que quiero así 'seleccionar max (longitud (Nombre)) como num1, Nombre de mi grupo de tablas por Nombre que tiene num1 = 18 ' , ya que sé desde la primera consulta que max es 18. Pero, ¿cómo combinar esto con una consulta? – JPro

+0

Ah, está bien, lo leí mal. En MS SQL usaría Select Name de my_table donde length (Name) = (select max (length (Name)) de my_table), pero estoy bastante seguro de que no es correcta la sintaxis de MySQL. – cjohn

0

supongo que se podría utilizar una solución como ésta:

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

no podría ser la solución óptima, sin embargo. .. Pero parece funcionar.

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

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

+0

El límite en la subconsulta es innecesario: max() es un operador de agregación y solo devolverá 1 fila. – Martin

2

Uso:

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

... suponiendo que conoce la longitud de antemano. Si no lo hace, utilice:

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) 
+0

¿es este el óptimo? – JPro

+0

@JPro: compruebe el plan de explicación, pero creo que Quassnoi es probablemente el más óptimo. –

118
SELECT name, LENGTH(name) AS mlen 
FROM mytable 
ORDER BY 
     mlen DESC 
LIMIT 1 
+6

+1: Por simplicidad, o "por qué no pensé en eso" –

+0

No tiene que pensar, solo pregunte, eso es más simple. : -> – wener

+2

Sí, solo pregunta todo y no pienses en algo.Suena justo. -.- – alexander

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

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

1

En caso de que necesite tanto máximo y mínimo de una misma 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; 
2

Ok, no estoy seguro de lo que estás usando (MySQL, SLQ Server, Oracle, MS Access ..) Pero se puede prueba el siguiente código Funciona en el ejemplo DB de W3School. Here probar esto:

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