max (длина (поле)) в mysql

86

Если я говорю:

select max(length(Name)) 
  from my_table

Я получаю результат 18, но мне нужны и соответствующие данные. Итак, если я скажу:

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

...это не работает. Я думаю, должно быть самосоединение, которое я не могу понять.

Кто-нибудь может дать мне подсказку?

JPro
источник
5
Я бы порекомендовал вам рассмотреть возможность использования CHAR_LENGTH () вместо LENGTH (). CHAR_LENGTH () возвращает длину строки в символах. LENGTH () возвращает длину в байтах. Для многобайтовых наборов символов эти значения могут быть разными, и вас, вероятно, интересует длина символа, а не длина байта.
Ike Walker

Ответы:

160
SELECT  name, LENGTH(name) AS mlen
FROM    mytable
ORDER BY
        mlen DESC
LIMIT 1
Quassnoi
источник
14

Отредактировано, будет работать для неизвестных значений max ():

select name, length( name )
from my_table
where length( name ) = ( select max( length( name ) ) from my_table );
cjohn
источник
да, но я хочу, чтобы заинтересованные nameлица имели максимальную длину 18
JPro 01
1
Хорошо, мне удалось получить то, что я хочу вот так select max(length(Name)) as num1,Name from my_table group by Name having num1 = 18, поскольку я знаю из первого запроса, что max равно 18. Но как объединить это в один запрос?
JPro 01
А, хорошо, я неправильно это понял. В MS SQL я бы использовал select Name from my_table, где length (Name) = (select max (length (Name)) from my_table), но я совершенно уверен, что это неправильный синтаксис MySQL.
cjohn 01
7

Хорошо, я не уверен, что вы используете (MySQL, SLQ Server, Oracle, MS Access ..), но вы можете попробовать приведенный ниже код. Он работает в базе данных W3School. Вот попробуйте это:

SELECT city, max(length(city)) FROM Customers;
Велизар Андреев Китанов
источник
2

Использование:

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

... при условии, что вы заранее знаете длину. Если вы этого не сделаете, используйте:

  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)
OMG Пони
источник
это оптимальный вариант?
JPro 01
@JPro: Проверьте план объяснения, но я думаю, что план Квассной, вероятно, самый оптимальный.
OMG Ponies,
2
Select URColumnName From URTableName Where length(URColumnName ) IN 
(Select max(length(URColumnName)) From URTableName);

Это даст вам записи в этом конкретном столбце, который имеет максимальную длину.

Мериш Джозеф
источник
2

Если вам нужны как max, так и min из одной таблицы:

    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
источник
1
select * 
from my_table 
where length( Name ) = ( 
      select max( length( Name ) ) 
      from my_table
      limit 1 
);

Это включает в себя два сканирования таблицы, и это может быть не очень быстро!

Мартин
источник
Ограничение в подзапросе не требуется: max () - оператор агрегирования и возвращает только 1 строку.
Мартин
1

Используйте CHAR_LENGTH () вместо LENGTH (), как предлагается в: MySQL - length () vs char_length ()

ВЫБЕРИТЕ имя, CHAR_LENGTH (имя) КАК mlen FROM mytable ORDER BY mlen DESC LIMIT 1

Раджеш Гоэль
источник
0

Я полагаю, вы могли бы использовать такое решение, как это:

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

Возможно, это не оптимальное решение ... Но, похоже, работает.

Паскаль МАРТИН
источник