สูงสุด (ความยาว (ฟิลด์)) ใน mysql


86

ถ้าฉันพูดว่า:

select max(length(Name)) 
  from my_table

ฉันได้ผลลัพธ์เป็น 18 แต่ฉันต้องการข้อมูลที่เกี่ยวข้องด้วย ดังนั้นถ้าฉันพูดว่า:

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

...มันไม่ทำงาน. ควรจะมีการเข้าร่วมด้วยตนเองซึ่งฉันคิดไม่ออก

ใครช่วยแจ้งเบาะแสให้หน่อยได้ไหม


6
ฉันขอแนะนำให้คุณพิจารณาใช้ CHAR_LENGTH () แทน LENGTH () CHAR_LENGTH () ส่งกลับความยาวของสตริงเป็นอักขระ LENGTH () ส่งกลับความยาวเป็นไบต์ สำหรับชุดอักขระแบบหลายไบต์ค่าเหล่านี้อาจแตกต่างกันและคุณอาจกังวลเกี่ยวกับความยาวอักขระไม่ใช่ความยาวไบต์
Ike Walker

คำตอบ:



14

แก้ไขแล้วจะใช้ได้กับค่า max () ที่ไม่รู้จัก:

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

ใช่ แต่ฉันต้องการผู้ที่เกี่ยวข้องnameซึ่งมีความยาวสูงสุด 18
JPro

1
ตกลงฉันจัดการเพื่อให้ได้สิ่งที่ฉันต้องการแบบนี้select max(length(Name)) as num1,Name from my_table group by Name having num1 = 18เนื่องจากฉันรู้จากแบบสอบถามแรกว่าสูงสุดคือ 18 แต่จะรวมสิ่งนี้เป็นแบบสอบถามเดียวได้อย่างไร
JPro

อ่าโอเคฉันอ่านผิด ใน MS SQL ฉันจะใช้ select Name จาก my_table โดยที่ length (Name) = (เลือก max (length (Name)) จาก my_table) แต่ฉันค่อนข้างมั่นใจว่าไวยากรณ์ MySQL ไม่ถูกต้อง
cjohn

7

โอเคฉันไม่แน่ใจว่าคุณใช้งานอะไรอยู่ (MySQL, SLQ Server, Oracle, MS Access .. ) แต่คุณสามารถลองใช้โค้ดด้านล่างนี้ได้ ทำงานในฐานข้อมูลตัวอย่างของ W3School นี่ ลองนี้

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: ตรวจสอบแผนการอธิบาย แต่ฉันคิดว่า Quassnoi น่าจะเหมาะสมที่สุด
OMG Ponies

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

สิ่งนี้จะให้ข้อมูลในคอลัมน์นั้น ๆ ซึ่งมีความยาวสูงสุด


2

ในกรณีที่คุณต้องการทั้ง max และ min จากตารางเดียวกัน:

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

ซึ่งเกี่ยวข้องกับการสแกนสองตารางดังนั้นอาจไม่เร็วมากนัก!


ขีด จำกัด ในแบบสอบถามย่อยไม่จำเป็น: max () เป็นตัวดำเนินการรวมและจะส่งคืน 1 แถวเท่านั้น
Martin


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.