Как сделать заказ по заголовку в MySQL, игнорируя слово «the»? - PullRequest
8 голосов
/ 30 марта 2009

У меня есть список фильмов, которые я сгруппировал по буквам. Естественно, фильмы, начинающиеся с буквы «Т», содержат около 80% фильмов, начинающихся с «The». Такие фильмы, как «Темный рыцарь», должны появиться в списке «D» и, желательно, также в «T». Как я могу это сделать?

Я использую следующий код в предложении WHERE для отображения фильмов, которые начинаются с определенной буквы, игнорируя «the», но это также имело удобный побочный эффект, так как такой фильм, как «Темный рыцарь», отображается для буквы D "и" T ".

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

Я хотел бы добиться этого, когда выявляю все фильмы, которые есть в базе данных.

Ответы [ 6 ]

17 голосов
/ 30 марта 2009

Если вы собираетесь часто выполнять этот запрос, вам нужно создать отдельное поле в таблице с «отсортированным» именем. Использование регулярных выражений или других операций лишает MySQL возможности использовать индекс.

Итак, самое простое и эффективное решение - добавить поле movie_title_short, которое содержит movie_title без «The» или «A». Обязательно добавьте индекс в поле movie_title_short!

6 голосов
/ 30 марта 2009

Как сказал Карл, я бы встроил это в свое индексируемое поле, чтобы избежать необходимости вычислять его каждый раз. Я бы рекомендовал сделать это немного по-другому, чтобы избежать избыточности.

movies (id, name, namePrefix)

например:

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

Таким образом, вы можете показывать эти фильмы двумя различными способами: "name, namePrefix" или "namePrefix name" и могут быть отсортированы соответственно.

1 голос
/ 03 сентября 2009

Только что сама проблема ... решение:

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

это даст вам только те результаты, которые начинаются с "The D" или "D"

1 голос
/ 30 марта 2009

Вы можете использовать функцию замены mysql в предложении select ...

 select replace(movie_title,'The ','') from ... order by replace(movie_title,'The ','')'
1 голос
/ 30 марта 2009
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
0 голосов
/ 22 мая 2009

Используйте это:

SELECT * FROM movies ORDER BY TRIM(LEADING 'the ' FROM LOWER(`movie_title`));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...