max (length (field)) w mysql

86

Jeśli powiem:

select max(length(Name)) 
  from my_table

Otrzymuję wynik jako 18, ale chcę też mieć dane, o których mowa. Więc jeśli powiem:

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

...to nie działa. Chyba powinno nastąpić samołączenie, którego nie potrafię rozgryźć.

Czy ktoś może podać mi wskazówkę?

JPro
źródło
5
Zalecałbym rozważenie użycia CHAR_LENGTH () zamiast LENGTH (). CHAR_LENGTH () zwraca długość łańcucha w znakach. LENGTH () zwraca swoją długość w bajtach. W przypadku zestawów znaków wielobajtowych wartości te mogą być różne i prawdopodobnie chodzi o długość znaków, a nie długość bajtów.
Ike Walker

Odpowiedzi:

160
SELECT  name, LENGTH(name) AS mlen
FROM    mytable
ORDER BY
        mlen DESC
LIMIT 1
Quassnoi
źródło
14

Edytowane, będzie działać dla nieznanych wartości max ():

select name, length( name )
from my_table
where length( name ) = ( select max( length( name ) ) from my_table );
cjohn
źródło
tak, ale chcę zainteresowanego, namektóry ma maksymalną długość 18
JPro
1
ok Udało mi się uzyskać to, co chcę select max(length(Name)) as num1,Name from my_table group by Name having num1 = 18, skoro z pierwszego zapytania wiem, że max to 18. Ale jak to połączyć w jedno zapytanie?
JPro
Ach, okej, źle to przeczytałem. W MS SQL użyłbym select Name from my_table, gdzie length (Name) = (wybierz max (length (Name)) z my_table), ale jestem prawie pewien, że nie jest to poprawna składnia MySQL.
cjohn
7

Ok, nie jestem pewien, czego używasz (MySQL, SLQ Server, Oracle, MS Access ..) Ale możesz wypróbować poniższy kod. Działa w przykładowej bazie danych W3School. Tutaj spróbuj tego:

SELECT city, max(length(city)) FROM Customers;
Velizar Andreev Kitanov
źródło
2

Posługiwać się:

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

... zakładając, że znasz wcześniej długość. Jeśli nie, użyj:

  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)
Kucyki OMG
źródło
czy to jest optymalne?
JPro
@JPro: Sprawdź plan wyjaśnienia, ale myślę, że Quassnoi jest prawdopodobnie najbardziej optymalny.
Kucyki OMG
2
Select URColumnName From URTableName Where length(URColumnName ) IN 
(Select max(length(URColumnName)) From URTableName);

W ten sposób uzyskasz rekordy w tej konkretnej kolumnie, która ma maksymalną długość.

Merish Joseph
źródło
2

W przypadku, gdy potrzebujesz zarówno wartości maksymalnej, jak i minimalnej z tej samej tabeli:

    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
źródło
1
select * 
from my_table 
where length( Name ) = ( 
      select max( length( Name ) ) 
      from my_table
      limit 1 
);

Obejmuje to dwa skanowanie tabeli, więc może nie być bardzo szybkie!

Jaskółka oknówka
źródło
Limit w zapytaniu podrzędnym jest niepotrzebny: max () jest operatorem agregacji i zwróci tylko 1 wiersz.
Martin
1

Użyj CHAR_LENGTH () zamiast LENGTH () zgodnie z sugestią: MySQL - length () vs char_length ()

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

Rajesh Goel
źródło
0

Przypuszczam, że przydałoby się rozwiązanie takie jak to:

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

Może nie jest to jednak optymalne rozwiązanie ... Ale wydaje się, że działa.

Pascal MARTIN
źródło