max (length (field)) di mysql

86

Jika saya mengatakan:

select max(length(Name)) 
  from my_table

Saya mendapatkan hasil sebagai 18, tetapi saya ingin data terkait juga. Jadi jika saya katakan:

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

...tidak bekerja. Seharusnya ada self join yang kurasa tidak bisa kupahami.

Adakah yang bisa memberi saya petunjuk?

JPro
sumber
6
Saya akan merekomendasikan agar Anda mempertimbangkan untuk menggunakan CHAR_LENGTH () daripada LENGTH (). CHAR_LENGTH () mengembalikan panjang string dalam karakter. LENGTH () mengembalikan panjangnya dalam byte. Untuk himpunan karakter multi-byte, nilai-nilai ini dapat berbeda, dan Anda mungkin memperhatikan panjang karakter, bukan panjang byte.
Ike Walker

Jawaban:

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

Diedit, akan berfungsi untuk nilai maks () yang tidak diketahui:

select name, length( name )
from my_table
where length( name ) = ( select max( length( name ) ) from my_table );
cjohn
sumber
ya, tetapi saya ingin yang bersangkutan nameyang memiliki panjang maksimum 18
JPro
1
ok saya berhasil mendapatkan apa yang saya inginkan seperti ini select max(length(Name)) as num1,Name from my_table group by Name having num1 = 18, karena saya tahu dari kueri pertama bahwa maks 18. Tetapi bagaimana cara menggabungkan ini menjadi satu kueri?
JPro
Ah, oke, saya salah membaca itu. Di MS SQL saya akan menggunakan pilih Nama dari my_table di mana panjang (Nama) = (pilih max (panjang (Nama)) dari my_table), tetapi saya cukup yakin bahwa sintaks MySQL tidak benar.
cjohn
7

Ok, saya tidak yakin apa yang Anda gunakan (MySQL, SLQ Server, Oracle, MS Access ..) Tetapi Anda dapat mencoba kode di bawah ini. Ini bekerja di contoh W3School DB. Ini coba ini:

SELECT city, max(length(city)) FROM Customers;
Velizar Andreev Kitanov
sumber
2

Menggunakan:

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

... dengan asumsi Anda tahu panjangnya sebelumnya. Jika tidak, gunakan:

  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 Ponies
sumber
@JPro: Periksa rencana penjelasan, tapi saya pikir Quassnoi kemungkinan yang paling optimal.
OMG Ponies
2
Select URColumnName From URTableName Where length(URColumnName ) IN 
(Select max(length(URColumnName)) From URTableName);

Ini akan memberi Anda catatan di kolom tertentu yang memiliki panjang maksimum.

Merish Joseph
sumber
2

Jika Anda membutuhkan maks dan min dari tabel yang sama:

    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
sumber
1
select * 
from my_table 
where length( Name ) = ( 
      select max( length( Name ) ) 
      from my_table
      limit 1 
);

Ini melibatkan dua pemindaian tabel, jadi mungkin tidak terlalu cepat!

Martin
sumber
Batasan di sub-kueri tidak diperlukan: max () adalah operator agregasi dan hanya akan mengembalikan 1 baris.
Martin
1

Gunakan CHAR_LENGTH () alih-alih LENGTH () seperti yang disarankan dalam: MySQL - length () vs char_length ()

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

Rajesh Goel
sumber
0

Saya kira Anda bisa menggunakan solusi seperti ini:

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

Mungkin bukan solusi optimal, meskipun ... Tapi sepertinya berhasil.

Pascal MARTIN
sumber