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?


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

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

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;

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)

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


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;

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!


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


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.