max (lunghezza (campo)) in mysql


86

Se dico:

select max(length(Name)) 
  from my_table

Ottengo il risultato come 18, ma voglio anche i dati in questione. Quindi se dico:

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

...non funziona. Dovrebbe esserci un self join immagino che non sono in grado di capirlo.

Qualcuno può fornirmi un indizio?


6
Ti consiglio di considerare l'utilizzo di CHAR_LENGTH () invece di LENGTH (). CHAR_LENGTH () restituisce la lunghezza di una stringa in caratteri. LENGTH () restituisce la sua lunghezza in byte. Per i set di caratteri multibyte questi valori possono essere diversi e probabilmente sei interessato alla lunghezza dei caratteri, non alla lunghezza dei byte.
Ike Walker

Risposte:


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

14

Modificato, funzionerà per valori max () sconosciuti:

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

sì, ma voglio l'interessato nameche abbia una lunghezza massima di 18
JPro

1
ok sono riuscito a ottenere quello che voglio in questo modo select max(length(Name)) as num1,Name from my_table group by Name having num1 = 18, poiché so dalla prima query che il massimo è 18. Ma come combinare questo a una query?
JPro

Ah, ok, l'ho letto male. In MS SQL userei selezionare Name da my_table dove length (Name) = (select max (length (Name)) from my_table), ma sono abbastanza certo che non sia corretta la sintassi MySQL.
cjohn

7

Ok, non sono sicuro di cosa stai usando (MySQL, SLQ Server, Oracle, MS Access ..) Ma puoi provare il codice qui sotto. Funziona nel DB di esempio W3School. Qui prova questo:

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

2

Uso:

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

... supponendo che tu conosca la lunghezza in anticipo. Se non lo fai, usa:

  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: controlla il piano di spiegazione, ma penso che quello di Quassnoi sia probabilmente il più ottimale.
OMG Ponies

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

Questo ti darà i record in quella particolare colonna che ha la lunghezza massima.


2

Nel caso in cui sia necessario sia max che min dalla stessa tabella:

    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 tratta di due scansioni di tabelle, quindi potrebbe non essere molto veloce!


Il limite nella sottoquery non è necessario: max () è un operatore di aggregazione e restituirà solo 1 riga.
Martin


0

Suppongo che potresti usare una soluzione come questa:

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

Potrebbe non essere la soluzione ottimale, però ... Ma sembra funzionare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.