max (Länge (Feld)) in MySQL


84

Wenn ich sage:

select max(length(Name)) 
  from my_table

Ich bekomme das Ergebnis als 18, aber ich möchte auch die betroffenen Daten. Also wenn ich sage:

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

...es funktioniert nicht. Ich denke, es sollte eine Selbstverbindung geben, die ich nicht herausfinden kann.

Kann mir bitte jemand einen Hinweis geben?


5
Ich würde empfehlen, dass Sie CHAR_LENGTH () anstelle von LENGTH () verwenden. CHAR_LENGTH () gibt die Länge einer Zeichenfolge in Zeichen zurück. LENGTH () gibt seine Länge in Bytes zurück. Bei Mehrbyte-Zeichensätzen können diese Werte unterschiedlich sein, und Sie befassen sich wahrscheinlich mit der Zeichenlänge und nicht mit der Bytelänge.
— Ike Walker

Antworten:


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

14

Bearbeitet, funktioniert für unbekannte max () Werte:

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

Ja, aber ich möchte die Betroffenen, namedie eine maximale Länge von 18
— JPro

1
ok, ich habe es geschafft, das zu bekommen, was ich will select max(length(Name)) as num1,Name from my_table group by Name having num1 = 18, da ich aus der ersten Abfrage weiß, dass max 18 ist. Aber wie kann man das zu einer Abfrage kombinieren?
— JPro

Ah, okay, das habe ich falsch verstanden. In MS SQL würde ich select Name from my_table verwenden, wobei length (Name) = (select max (length (Name)) from my_table), aber ich bin mir ziemlich sicher, dass die MySQL-Syntax nicht korrekt ist.
— John

6

Ok, ich bin nicht sicher, was Sie verwenden (MySQL, SLQ Server, Oracle, MS Access ..). Sie können jedoch den folgenden Code ausprobieren. Es funktioniert in der W3School-Beispiel-DB. Hier versuchen Sie dies:

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

2

Verwenden:

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

... vorausgesetzt, Sie kennen die Länge vorher. Wenn Sie dies nicht tun, verwenden Sie:

  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)

ist das das optimale?
— JPro

@JPro: Überprüfen Sie den Erklärungsplan, aber ich denke, Quassnoi ist wahrscheinlich der optimalste.
— OMG Ponys

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

Dadurch erhalten Sie die Datensätze in dieser bestimmten Spalte mit der maximalen Länge.


2

Falls Sie sowohl max als auch min aus derselben Tabelle benötigen:

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

Dies beinhaltet zwei Tischscans und ist daher möglicherweise nicht sehr schnell!


Das Limit in der Unterabfrage ist nicht erforderlich: max () ist ein Aggregationsoperator und gibt nur 1 Zeile zurück.
— Martin


0

Ich nehme an, Sie könnten eine Lösung wie diese verwenden:

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

Könnte aber nicht die optimale Lösung sein ... Aber scheint zu funktionieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.