【问题标题】:max(length(field)) in mysqlmysql中的最大值(长度(字段))
【发布时间】:2010-03-01 17:12:55
【问题描述】:

如果我说:

select max(length(Name)) 
  from my_table

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

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

...它不起作用。应该有一个自我加入,我想我无法弄清楚。

谁能给我一个线索?

【问题讨论】:

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

标签: sql mysql


【解决方案1】:
SELECT  name, LENGTH(name) AS mlen
FROM    mytable
ORDER BY
        mlen DESC
LIMIT 1

【讨论】:

    【解决方案2】:

    已编辑,适用于未知的 max() 值:

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

    【讨论】:

    • 是的,但我想要最大长度为 18 的相关 name
    • 好的,我设法得到了我想要的 select max(length(Name)) as num1,Name from my_table group by Name having num1 = 18,因为我从第一个查询中知道最大值是 18。但是如何将它组合到一个查询中?
    • 啊,好吧,我看错了。在 MS SQL 中,我会使用 select Name from my_table where length(Name) = (select max(length(Name)) from my_table),但我相当肯定这不是正确的 MySQL 语法。
    【解决方案3】:

    好的,我不确定您使用的是什么(MySQL、SLQ Server、Oracle、MS Access..) 但是你可以试试下面的代码。它在 W3School 示例数据库中工作。 Here 试试这个:

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

    【讨论】:

    • 用mysql; "这与 sql_mode=only_full_group_by 不兼容"
    【解决方案4】:

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

        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;
    

    【讨论】:

      【解决方案5】:

      用途:

        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:检查解释计划,但我认为 Quassnoi 可能是最优化的。
      【解决方案6】:
      Select URColumnName From URTableName Where length(URColumnName ) IN 
      (Select max(length(URColumnName)) From URTableName);
      

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

      【讨论】:

        【解决方案7】:

        按照以下建议使用 CHAR_LENGTH() 而不是 LENGTH(): MySQL - length() vs char_length()

        SELECT name, CHAR_LENGTH(name) AS mlen 来自我的表 ORDER BY mlen DESC 限制 1 个

        【讨论】:

        • 就我而言,我想知道 mediumtext 中的数据是否可以复制到 tinytext 字段中,所以 length 是我需要的!
        【解决方案8】:
        select * 
        from my_table 
        where length( Name ) = ( 
              select max( length( Name ) ) 
              from my_table
              limit 1 
        );
        

        这涉及两次表扫描,因此可能不是很快!

        【讨论】:

        • 子查询中的限制是不必要的:max()是一个聚合运算符,只会返回1行。
        【解决方案9】:

        我想你可以使用这样的解决方案:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-10-17
          • 2016-06-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-04
          相关资源
          最近更新 更多