max (length (trường)) trong mysql


86

Nếu tôi nói:

select max(length(Name)) 
  from my_table

Tôi nhận được kết quả là 18, nhưng tôi cũng muốn có dữ liệu liên quan. Vì vậy, nếu tôi nói:

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

...nó không hoạt động. Nên có một sự tham gia tự tôi đoán mà tôi không thể tìm ra nó.

Bất cứ ai có thể vui lòng cung cấp cho tôi một đầu mối?


5
Tôi khuyên bạn nên cân nhắc sử dụng CHAR_LENGTH () thay vì LENGTH (). CHAR_LENGTH () trả về độ dài của một chuỗi ký tự. LENGTH () trả về độ dài của nó tính bằng byte. Đối với các bộ ký tự nhiều byte, các giá trị này có thể khác nhau và bạn có thể quan tâm đến độ dài ký tự chứ không phải độ dài byte.
Ike Walker

Câu trả lời:


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

14

Đã chỉnh sửa, sẽ hoạt động cho các giá trị max () không xác định:

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

vâng, nhưng tôi muốn cái có liên quan namecó tối đa 18
JPro

1
ok Tôi đã quản lý để có được những gì tôi muốn như thế này select max(length(Name)) as num1,Name from my_table group by Name having num1 = 18, vì tôi biết từ truy vấn đầu tiên rằng tối đa là 18. Nhưng làm thế nào để kết hợp điều này thành một truy vấn?
JPro

À, được rồi, tôi đã đọc nhầm. Trong MS SQL, tôi sẽ sử dụng select Name từ my_table trong đó length (Name) = (select max (length (Name)) from my_table), nhưng tôi khá chắc chắn rằng cú pháp MySQL không đúng.
cjohn

7

Ok, tôi không chắc bạn đang sử dụng cái gì (MySQL, SLQ Server, Oracle, MS Access ..) Nhưng bạn có thể thử đoạn mã bên dưới. Nó hoạt động trong DB ví dụ W3School. Ở đây hãy thử cái này:

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

2

Sử dụng:

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

... giả sử bạn biết trước độ dài. Nếu bạn không, hãy sử dụng:

  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)

đây có phải là cái tối ưu?
JPro

@JPro: Kiểm tra phương án giải thích, nhưng tôi nghĩ Quassnoi's có thể là tối ưu nhất.
OMG Ponies

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

Điều này sẽ cung cấp cho bạn các bản ghi trong cột cụ thể có độ dài tối đa.


2

Trong trường hợp bạn cần cả tối đa và tối thiểu từ cùng một bảng:

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

Nó liên quan đến hai lần quét bảng và vì vậy có thể không nhanh lắm!


Giới hạn trong truy vấn phụ là không cần thiết: max () là toán tử tổng hợp và sẽ chỉ trả về 1 hàng.
Martin


0

Tôi cho rằng bạn có thể sử dụng một giải pháp như sau:

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

Có thể không phải là giải pháp tối ưu, mặc dù ... Nhưng có vẻ hiệu quả.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.