2009-08-17 7 views
15

Estoy tratando de ordenar una lista de títulos, pero actualmente hay un bloque gigante de títulos que comienzan con 'The'. Me gustaría que se ignore el 'The', y el tipo de resolver la segunda palabra. ¿Es eso posible en SQL, o tengo que hacer un trabajo personalizado en el front-end?ORDEN personalizado BY para ignorar 'el'

Por ejemplo, la clasificación actual:

  • Avión
  • Hijos de los hombres
  • Full Metal Jacket
  • Pulp Fiction
  • La fuente
  • La gran evasión
  • La Reina
  • Zardoz

sería mejor clasificado:

  • Avión
  • Hijos de los hombres
  • La fuente
  • Full Metal Jacket
  • La gran evasión
  • Pulp Fiction
  • La reina
  • Zardoz

Casi como si los registros se almacenan como 'Fuente, La', y similares. Pero no quiero almacenarlos de esa manera si puedo, que es, por supuesto, el quid del problema.

+1

Gracias por recordarme acerca de Zardoz. Ahora voy a tener pesadillas sobre cabezas flotantes. – MusiGenesis

+0

Me alegra que alguien haya descubierto eso: D – dimo414

+0

Ahora, Full Metal Jacket, hay una gran película. O como me gusta decir a mis fechas: "Estoy ... en un mundo ... de $ #! +". – MusiGenesis

Respuesta

12

Lo mejor es tener una columna calculada para hacer esto, de modo que pueda indexar la columna calculada y ordenar por eso. De lo contrario, el género será mucho trabajo.

Así que usted puede tener su columna calculada como:

CASE WHEN title LIKE 'The %' THEN stuff(title,1,4,'') + ', The' ELSE title END 

Editar: Si MATERIA no está disponible en MySQL, y luego utilizar DERECHA o SUBSECUENCIA para eliminar los principales 4 caracteres. Pero aún así trate de usar una columna calculada si es posible, para que la indexación sea mejor. La misma lógica debería ser aplicable para extraer "A" y "An".

Rob

+2

es posible que también desee ponerlo todo en minúscula en la columna de ordenación, para obtener géneros insensibles a mayúsculas y minúsculas (y búsquedas) – Thilo

+1

Sí, si tiene una situación que distingue entre mayúsculas y minúsculas. Pero imagino que, como títulos de películas, es probable que el caso esté controlado en la entrada, de modo que no necesita tener el golpe de rendimiento asociado a la búsqueda de registros en función de su equivalente en minúsculas. –

4

creo que se podría hacer algo como

ORDER BY REPLACE(TITLE, 'The ', '') 

aunque esto sería reemplazar cualquier aparición de 'La' con '', no sólo la primera 'El', aunque no creo que esto afectaría muy mucho.

+0

Bueno, tampoco me gusta mi idea, pero al menos explique si no es la mejor solución o si ni siquiera se ejecutará. – MusiGenesis

9

Algo así como:

ORDER BY IF(LEFT(title,2) = "A ", 
      SUBSTRING(title FROM 3), 
      IF(LEFT(title,3) = "An ", 
       SUBSTRING(title FROM 4), 
       IF(LEFT(title,4) = "The ", 
       SUBSTRING(title FROM 5), 
       title))) 

Sin embargo, dada la sobrecarga de hacer esto más que un par de veces, usted es realmente mejor que almacena el valor de ordenación del título en otra columna ...

3

La mejor manera de manejar esto sería tener una columna que contenga el valor que desea usar específicamente para ordenar la salida. Entonces será sólo tiene que utilizar:

SELECT t.title 
    FROM MOVIES t 
ORDER BY t.order_title 

No van a ser diferentes reglas sobre lo que debe y no debe ser utilizado para pedir los títulos.

Basado en su ejemplo, una alternativa sería utilizar algo como:

SELECT t.title 
    FROM MOVIES t 
ORDER BY SUBSTR(t.title, INSTR(t.title, 'The ')) 

Se puede usar un comando CASE para contener las distintas reglas.

3

Sin duda, puede organizar dinámicamente quitar 'The', aunque pronto encontrará que tiene que lidiar con 'A' y 'An' (excepto en el caso especial de títulos como "A is for Alibi") . Cuando las películas "extranjeras" entren en la mezcla, tendrás que arreglártelas con "El" y "La" (a excepción de ese caso molesto, "LA Story"). Luego mezcle algunas películas alemanas, y tendrá que lidiar con 'Der' y 'Die' (excepto por ese molesto conjunto de casos 'Die Hard' edge). Ver el patrón? Te diriges hacia un camino que se hace cada vez más largo y más lleno de casos especiales.

El camino a seguir en esto que evita un conjunto cada vez mayor de casos especiales es almacenar el título como lo desee mostrar y almacenar el título como desee.

+0

Muy buen punto, aunque, afortunadamente, en mi caso de uso la perfección no es necesaria, por lo que esos casos extremos pueden ignorarse, al menos por ahora. +1 por mencionar el problema sin embargo. – dimo414

0

para SQLite

ORDER BY CASE WHEN LOWER(SUBSTR(title,1,4)) = 'the ' THEN SUBSTR(title,5) ELSE title END ASC 
1

maneras que sólo se eliminará el primer The:

=SUBSTITUTE(A1,"The ","",1) OR more reliably: 

=IF(IF(LEFT(A1,4)="The ",TRUE)=TRUE,RIGHT(A1,(LEN(A1)-4)),A1) 

segundo es decir, básicamente, si el primer dígito de la izquierda es igual a The, a continuación, comprobar el número de dígitos en el celda, y mostrar solo los dígitos de la derecha excluyendo The.

Cuestiones relacionadas