2011-02-20 16 views
7

Tengo un campo varchar que es un código de letras y se auto aumenta (manualmente), entonces después de A es B hasta después de que Z se convierte en AA y así sucesivamente.Encontrar max en mysql cuando la columna es varchar

Mi problema es cuando llegué a AA y trato de seleccionar MAX de este campo:

SELECT MAX(letter) from jobs 

devoluciones Z en lugar de AA. Esto es correcto si está ordenando nombres, pero tengo un código. Hay una forma de hacerlo bien?

Respuesta

2

Esto puede ayudar? Ordene por longitud primero, luego por letra.

SELECT letter FROM jobs 
ORDER BY LENGTH(letter) DESC, letter DESC 
LIMIT 0, 1 
+0

Eso todavía dará Z para el conjunto de entrada [A..Z, AA]. – paxdiablo

+0

Lo siento, editado después de darme cuenta de que era estúpido por no leer correctamente. – jocull

8

Pruebe este. Esto obligará a las cadenas de más peso como siendo más alta que las cadenas más cortas:

SELECT letter 
FROM jobs 
ORDER BY LENGTH(letter) DESC, letter DESC 
LIMIT 1; 

Editar: Sí, se olvidó de ordenar DESC para conseguir la máxima ...

+0

+1, eso es mejor que mi solución de subconsulta. Una cosa a tener en cuenta si desea evitar el rendimiento de las funciones por fila es tener otra columna (indexada) llamada letter_len que se rellena con un desencadenador insert/update, y luego usar eso en la cláusula order by. Eso amortizará el costo del cálculo (hecho cuando los datos cambian) en todas las lecturas, acelerando sustancialmente las consultas. – paxdiablo

+0

Funciona. Muchas gracias. –

1

Puesto que usted es después de que el máximo de la campo más largo, comenzaría con algo como lo siguiente. No estoy seguro de si la sintaxis es correcta. Básicamente, debe ignorar todos los valores de columna, excepto los más largos.

select max(letter) from jobs 
where len(letter) = (
    select max(len(letter)) from jobs 
) 

Cualquiera que sea la solución que elija, considere la opción de añadir otra columna para mantener la longitud carta y haga que sea controlado por un desencadenador de inserción/actualización (suponiendo MySQL tiene que).

Al indexar esa columna, puede acelerar en gran medida sus consultas ya que elimina las funciones por fila durante select. El momento adecuado para incurrir en el costo es cuando los datos cambian de modo que el costo del cálculo se amortice en todas las lecturas.

Esto no funcionará en situaciones donde la base de datos se escribe con más frecuencia que la lectura, pero son relativamente raras en mi experiencia.

0

¿Tiene una longitud máxima para su campo? Si es así, ¿también puede estomatizar a la derecha los datos en ese campo? Lo más probable es que las respuestas sean (1) empíricamente "sí", y 5 podría ser una longitud superior, y (2) no realmente. Sin embargo, estaba usted capaz de decir 'sí' a la vez, entonces sería capaz de utilizar este (donde las cajas son espacios en blanco):

  • '☐☐☐☐A'
  • ...
  • '☐☐☐☐Z'
  • '☐☐☐AA'
  • '☐☐☐AB'
  • ...
  • '☐☐☐BA'
  • ...
  • '☐☐☐ZZ'
  • '☐☐AAA'

realistas, que probablemente no va a estar bien para usted, y por lo tanto no va a ayudar.

Cuestiones relacionadas