mysqlのmax(length(field))


86

私が言うなら:

select max(length(Name)) 
  from my_table

結果は18になりますが、関連するデータも必要です。だから私が言うなら:

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

...それは動作しません。私はそれを理解することができないと思う自己結合があるはずです。

誰かが私に手がかりを提供できますか?


5
LENGTH()の代わりにCHAR_LENGTH()の使用を検討することをお勧めします。CHAR_LENGTH()は、文字列の長さを文字数で返します。LENGTH()は、その長さをバイト単位で返します。マルチバイト文字セットの場合、これらの値は異なる可能性があり、おそらくバイト長ではなく文字長に関心があります。
Ike Walker

回答:


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のmaxlenghtを持っている懸念を望んでいます
JPro 2010年

1
select max(length(Name)) as num1,Name from my_table group by Name having num1 = 18最初のクエリから最大が18であることがわかっているので、このように欲しいものを何とか取得できました。しかし、これを1つのクエリに組み合わせるにはどうすればよいでしょうか。
JPro 2010年

ああ、わかりました、私はそれを読み間違えました。MS SQLでは、select Name from my_table where length(Name)=(select max(length(Name))from my_table)を使用しますが、MySQLの構文が正しくないことはかなり確信しています。
cjohn 2010年

7

わかりました。何を使用しているかわかりません(MySQL、SLQサーバー、Oracle、MS Accessなど)。ただし、以下のコードを試すことができます。W3SchoolサンプルDBで動作します。ここで これを試してください:

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 2010年

@JPro:説明プランを確認してください。でも、Quassnoiが最適だと思います。
OMGポニー

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

これには2つのテーブルスキャンが含まれるため、それほど高速ではない可能性があります。


サブクエリの制限は不要です。max()は集計演算子であり、1行のみを返します。
マーティン


0

私はあなたがこのような解決策を使うことができると思います:

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

しかし、最適な解決策ではないかもしれません...しかし、うまくいくようです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.