mysql中的max(length(field))


86

如果我说:

select max(length(Name)) 
  from my_table

我得到的结果为18,但我也想要有关的数据。所以,如果我说:

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

...这没用。我猜应该有一个自我连接,我无法弄清楚。

谁能给我一个线索?


5
我建议您考虑使用CHAR_LENGTH()而不是LENGTH()。CHAR_LENGTH()返回字符串的长度(以字符为单位)。LENGTH()返回其长度(以字节为单位)。对于多字节字符集,这些值可以不同,并且您可能关心的是字符长度,而不是字节长度。
艾克·沃克

Answers:


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

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,因为从第一个查询中我知道max是18。但是如何将其组合到一个查询中呢?
JPro

啊,好的,我误读了。在MS SQL中,我将使用my_table中的选择名称,其中length(Name)=(my_table中选择max(length(Name))选择),但我相当确定这是不正确的MySQL语法。
cjohn


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:检查解释计划,但我认为Quassnoi可能是最佳选择。
OMG Ponies,2010年

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

这将为您提供该特定列中具有最大长度的记录。


2

如果您需要同一张表中的最大值和最小值:

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

虽然可能不是最佳的解决方案,但似乎可行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.