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


86

Якщо я скажу:

select max(length(Name)) 
  from my_table

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

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

...вона не працює. Має бути самостійне приєднання, я здогадуюсь, що я не в змозі це зрозуміти.

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


5
Я рекомендую вам розглянути можливість використання CHAR_LENGTH () замість LENGTH (). CHAR_LENGTH () повертає довжину рядка в символах. LENGTH () повертає свою довжину в байтах. Для багатобайтових наборів символів ці значення можуть бути різними, і вас, ймовірно, турбує довжина символу, а не довжина байтів.
Айк Уокер

Відповіді:



14

Відредаговано, буде працювати для невідомих значень max ():

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

так, але я хочу зацікавленого, nameякий має довжину 18
JPro,

1
добре, мені вдалося отримати бажане select max(length(Name)) as num1,Name from my_table group by Name having num1 = 18, оскільки я з першого запиту знаю, що макс. 18. Але як поєднати це з одним запитом?
JPro

Ах, добре, я неправильно це прочитав. У MS SQL я б використовував select Name з my_table, де length (Name) = (select max (length (Name)) з my_table), але я впевнений, що це неправильний синтаксис MySQL.
cjohn

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)

це оптимальний?
JPro

@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;

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

Це передбачає два сканування таблиці, і тому це може бути не дуже швидко!


Обмеження в підзапиті непотрібне: max () є оператором агрегування і повертає лише 1 рядок.
Мартін


0

Я припускаю, що ви могли б використовувати таке рішення, як це:

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

Хоча це може бути не оптимальним рішенням ... Але, здається, це працює.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.