2009-03-30 19 views
8

Tengo una lista de películas que he agrupado por carta. Naturalmente, las películas que comienzan con la letra "T" tienen aproximadamente el 80% de las películas que comienzan con "The". Películas como "The Dark Knight" deberían aparecer en la lista "D", y preferiblemente en la "T" también. De cualquier manera que puedo hacer eso?¿Cómo ORDEN por título en mysql, ignorando la palabra "el"?

Utilizo el siguiente código en la cláusula WHERE para mostrar películas que comienzan con una determinada letra, ignorando "la", pero esto también tuvo un efecto secundario conveniente al aparecer una película como "The Dark Knight" para la letra "D" y "T".

WHERE movie_title REGEXP CONCAT('^(the)?', '$letter') 

Me gustaría lograr esto cuando hago eco de todas las películas que están en la base de datos.

+1

Para lanzar una llave en la ecuación: se supone que los títulos que comienzan con números ("101 Dalmaciones") se ordenan como si el número se deletreara. En este caso, debajo de "O". –

Respuesta

18

Si va a realizar esta consulta con frecuencia, querrá crear un campo separado en la tabla con el nombre 'ordenado'. El uso de expresiones regulares u otras operaciones imposibilitan que MySQL aproveche el índice.

Por lo tanto, la solución más simple y más eficiente es hacer su agregar un campo movie_title_short, que contiene movie_title sin el "The" o "A". ¡Asegúrese de agregar un índice al campo movie_title_short también!

+0

Yah lo pensé, pero no se ejecutará mucho. –

+0

El espacio de almacenamiento es más económico que el tiempo de CPU. Solo use un campo title_order ya que sin duda también querrá ordenar por los mismos criterios. – cletus

+0

Además, agregar un campo separado no resolverá el problema de mostrar la misma película en la "T" y otra lista de letras. –

1
select right(movie_title, char_length(movie_title)-4) as movie_title 
from movies 
where left(movie_title,3) = 'the' 
union 
select movie_title 
from movies 
1

Puede utilizar la función de reemplazar MySQL en la cláusula select ...

select replace(movie_title,'The ','') from ... order by replace(movie_title,'The ','')' 
+0

No, quiere que las películas "The" aparezcan dos veces cuando se vuelquen todas juntas, con y sin 'the'. – GSerg

+0

Lo hará si usa la misma cláusula WHERE. ¿Pueden -1 comentarios? :) – ashawley

6

Como dijo Carl, construiría esto en su propio campo indexable para evitar tener que calcular cada vez . Sin embargo, recomendaría hacerlo de una forma ligeramente diferente para evitar la redundancia.

movies (id, name, namePrefix) 

por ejemplo:

| Dark Knight  | The | 
| Affair To Remember | An | 
| Beautiful Mind  | A | 

esta manera se puede mostrar estas películas de dos maneras diferentes: "name, namePrefix" o "namePrefix name" y se pueden ordenar en consecuencia.

+0

¿Alguien sabe si hay una lista canónica de palabras para cortar los títulos al ordenar, como "The", "An" y "A". Además, las reglas para el uso de mayúsculas: ¿debería ser "un asunto para recordar" o "un asunto para recordar"? – Evan

0

Utilice esta:

SELECT * FROM movies ORDER BY TRIM(LEADING 'the ' FROM LOWER(`movie_title`)); 
1

Sólo tenía ese problema a mí mismo ... solución es:

SELECT * FROM movies WHERE title REGEXP '^d' AND title NOT REGEXP '^the ' OR title REGEXP '^the d' 

esto le dará sólo los resultados que comienza con "El D" o "D"

Cuestiones relacionadas