max (longueur (champ)) dans mysql

86

Si je dis:

select max(length(Name)) 
  from my_table

J'obtiens le résultat 18, mais je veux aussi les données concernées. Donc si je dis:

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

...ça ne marche pas. Il devrait y avoir une auto-adhésion, je suppose, que je suis incapable de comprendre.

Quelqu'un peut-il me donner un indice?

JPro
la source
5
Je vous recommande d'envisager d'utiliser CHAR_LENGTH () au lieu de LENGTH (). CHAR_LENGTH () renvoie la longueur d'une chaîne en caractères. LENGTH () renvoie sa longueur en octets. Pour les jeux de caractères multi-octets, ces valeurs peuvent être différentes et vous êtes probablement préoccupé par la longueur des caractères et non par la longueur des octets.
Ike Walker

Réponses:

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

Modifié, fonctionnera pour les valeurs max () inconnues:

select name, length( name )
from my_table
where length( name ) = ( select max( length( name ) ) from my_table );
cjohn
la source
oui, mais je veux le concerné namequi a une longueur maximale de 18
JPro
1
ok j'ai réussi à obtenir ce que je veux comme ça select max(length(Name)) as num1,Name from my_table group by Name having num1 = 18, car je sais depuis la première requête que le maximum est de 18. Mais comment combiner cela en une seule requête?
JPro
Ah, d'accord, j'ai mal lu ça. Dans MS SQL, j'utiliserais select Name from my_table where length (Name) = (select max (length (Name)) from my_table), mais je suis assez certain que la syntaxe MySQL n'est pas correcte.
cjohn
7

Ok, je ne suis pas sûr de ce que vous utilisez (MySQL, SLQ Server, Oracle, MS Access ..) Mais vous pouvez essayer le code ci-dessous. Cela fonctionne dans l'exemple DB de W3School. Essayez ici ceci:

SELECT city, max(length(city)) FROM Customers;
Velizar Andreev Kitanov
la source
2

Utilisation:

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

... en supposant que vous connaissez la longueur à l'avance. Si vous ne le faites pas, utilisez:

  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)
Poneys OMG
la source
est-ce le meilleur?
JPro
@JPro: Vérifiez le plan d'explication, mais je pense que celui de Quassnoi est probablement le plus optimal.
OMG Ponies
2
Select URColumnName From URTableName Where length(URColumnName ) IN 
(Select max(length(URColumnName)) From URTableName);

Cela vous donnera les enregistrements dans cette colonne particulière qui a la longueur maximale.

Merish Joseph
la source
2

Au cas où vous auriez besoin à la fois de max et min de la même table:

    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
la source
1
select * 
from my_table 
where length( Name ) = ( 
      select max( length( Name ) ) 
      from my_table
      limit 1 
);

Cela implique deux scans de table, et donc peut-être pas très rapide!

Martin
la source
La limite dans la sous-requête n'est pas nécessaire: max () est un opérateur d'agrégation et ne retournera qu'une ligne.
Martin
1

Utilisez CHAR_LENGTH () au lieu de LENGTH () comme suggéré dans: MySQL - length () vs char_length ()

SELECT nom, CHAR_LENGTH (nom) AS mlen FROM ma table ORDER BY mlen DESC LIMIT 1

Rajesh Goel
la source
0

Je suppose que vous pouvez utiliser une solution telle que celle-ci:

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

Ce n'est peut-être pas la solution optimale, cependant ... Mais semble fonctionner.

Pascal MARTIN
la source