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?

JPro
quelle
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
Quassnoi
quelle
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 );
cjohn
quelle
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;
Velizar Andreev Kitanov
quelle
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)
OMG Ponys
quelle
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.

Merish Joseph
quelle
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;
Suman
quelle
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!

Martin
quelle
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.

Pascal MARTIN
quelle