Пропуск первого буквенно-цифрового символа (The | An?) - PullRequest
3 голосов
/ 11 апреля 2010

У меня есть список исполнителей, альбомов и треков, которые я хочу отсортировать по первой букве их имени. Проблема возникает, когда я хочу игнорировать "The", "A", "An" и другие различные не алфавитно-цифровые символы (Говоря с вами "Странный Аль" Янкович и [диалог]) У Джанго хорошее начало «^ (An? | The) +», но я хочу игнорировать тех и нескольких других по моему выбору.

Я делаю это в Django, используя базу данных MySQL с сопоставлением utf8_bin.

EDIT

Ну, я виноват, что не упомянул об этом, но база данных, к которой я обращаюсь, почти готова. Он создан и поддерживается Amarok , и я не могу изменить его без целой путаницы проблем. При этом в таблице артистов The Chemical Brothers указан как The Chemical Brothers, поэтому я думаю, что застрял здесь. Возможно, это будет медленно, но это не столько для меня, сколько для меня личный проект.

Ответы [ 2 ]

3 голосов
/ 11 апреля 2010

То, что вы просите, вероятно, не то, что вам нужно. Вы, вероятно, не хотите сортировать только по первой букве. Если первая буква одна и та же, вы, как правило, также хотите посмотреть вторую букву и т. Д. Это приведет к тому, что все песни одного исполнителя будут сгруппированы вместе при сортировке по исполнителю.

Обновленный ответ

Вы сказали, что вам не разрешено менять базу данных. Затем вы можете использовать TRIM(LEADING ... FROM ...) для удаления неинтересных слов, но учтите, что это будет медленно, так как запрос не сможет использовать индекс для столбца.

SELECT *
FROM song
WHERE SUBSTRING(TRIM(LEADING 'The ' FROM TRIM(LEADING 'A ' FROM title)), 1, 1) = 'B'
ORDER BY TRIM(LEADING 'The ' FROM TRIM(LEADING 'A ' FROM title))

Результат:

'The Bar'   -- "The" is ignored when sorting.
'Baz A'    

Данные испытаний:

CREATE TABLE song (title NVARCHAR(100) NOT NULL);
INSERT INTO song (title) VALUES
('The Bar'),
('Baz A'),
('Foo'),
('Qux'),
('A Quux');

Оригинальный ответ

Также обратите внимание, что если вы ORDER BY функция столбца, это будет очень медленно, когда у вас много записей, так как индекс по этому столбцу не может быть использован. Вместо этого вам следует сохранить другой столбец, в котором вы удалите все неинтересные слова (the, an и т. Д.) И упорядочите их по этому столбцу. Вы можете вставить этот столбец из своего приложения при вставке строки или использовать триггер в базе данных.

0 голосов
/ 07 октября 2012

В PostgreSQL я обнаружил, что это хороший способ начать сортировку такого типа:

SELECT title
FROM  albums
ORDER BY    
  CASE 
    WHEN title ~* '^The ' THEN substring(title from 5)
    WHEN title ~* '^An '  THEN substring(title from 4)
    WHEN title ~* '^A '   THEN substring(title from 3)
    ELSE title
  END asc;

Я бы предположил, что в MySQL есть похожие существа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...