2010-03-01 17 views
60

Se io dico:massima (lunghezza (campo)) in mysql

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. Ci dovrebbe essere un auto join, credo che non riesco a capirlo.

Qualcuno può darmi un suggerimento?

+4

vi consiglio di considerare l'utilizzo CHAR_LENGTH() al posto di LUNGHEZZA(). CHAR_LENGTH() restituisce la lunghezza di una stringa in caratteri. LENGTH() restituisce la sua lunghezza in byte. Per i set di caratteri multi-byte questi valori possono essere diversi e probabilmente si tratta della lunghezza dei caratteri, non della lunghezza dei byte. –

risposta

11

cura, lavorerà per sconosciuto max() valori:

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

sì, ma voglio il 'nome' interessato 'che ha lunghezza massima di 18 – JPro

+1

ok sono riuscito a ottenere quello che voglio come questo' selezionare max (lunghezza (nome)) come num1, nome da my_table gruppo per nome con num1 = 18' , dal momento che so dalla prima query che il massimo è 18. Ma come combinare questo a una query? – JPro

+0

Ah, ok, ho letto male questo. In MS SQL vorrei usare select Name da my_table dove length (Name) = (selezionare max (length (Name)) da my_table), ma sono abbastanza sicuro che non è corretta la sintassi MySQL. – cjohn

0

Immagino che si potrebbe utilizzare 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.

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

Si tratta di due scansioni di tabella, e quindi potrebbe non essere molto veloce!

+0

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

2

Usa:

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

... supponendo che si conosce la lunghezza in anticipo. Se non lo fai, usare:

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

è questo quello ottimale? – JPro

+0

@JPro: controlla il piano di spiegazioni, ma penso che Quassnoi sia probabilmente il più ottimale. –

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

+1: Per semplicità, o "perché non ci ho pensato" –

+0

Non devi pensare, basta chiedere, è più semplice. : -> – wener

+2

Sì, basta chiedere tutto e non pensare a qualcosa.Sembra giusto. -.- – alexander

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

Questo vi darà i record in quel particolare colonna che ha la lunghezza massima.

1

in caso di necessità, sia max e min dalla stessa tavola:

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, io non sono sicuro di quello che stai usando (MySQL, SLQ Server, Oracle, MS Access ..) ma è possibile prova il codice qui sotto. Funziona nel DB di esempio W3School. Here provare questo:

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